在实践中有这么一个需求,有一个BaseActivity,相同布局放置在这个Activity中,其他Activity继承自BaseActivity。为了使所有Activity都统一使用背景图片,一般做法是在BaseActivity的根布局中设置背景图片,但是这样会有一个不好的效果就是当程序第一次启动的时候也就是主Activity启动的时候,会有一阵黑屏时间,如果主Activity做的事情比较多的话,这个黑屏时间就会很长(直观感觉就是启动很慢)。于是有资料就说,自定义activity的theme,设置属性android:windowBackground为需要的背景图片,这样程序启动的时候,背景图片会立马显示出来,给人的感觉就是启动很快了。
于是按照上面所说的方法,自定义了一个theme,并在manifest中设置给主activity
styles文件中自定义theme
复制代码
1
2
3
4<style name="MyTheme" parent="android:Theme.NoTitleBar.Fullscreen"/> <style name="BaseTheme" parent="MyTheme"> <item name="android:windowBackground">@mipmap/home_bg</item> </style>
manifest中设置
复制代码
1
2
3
4<activity android:name=".MainActivity" android:theme="@style/BaseTheme" >
虽然实现了主activity的背景,但是其他activity也同样需要这个背景。我在想是不是给BaseActivity设置theme属性,而其他activity继承自BaseActivity,这样就不需要为每个activity设置theme了。而事实并非如此,我在manifest中只设置了BaseActivity的theme,其他activity的theme都未设置,虽然其他activity都继承自BaseActivity,但是这个在manifest中设置的theme并未传递到其子类中。这是什么原因呢?
其实,用代码的方法也是可以把这个theme传递给其子activity的。具体这样做:
复制代码
就是在BaseActivity中的onCreate方法,在setContentView之前载入这个自定义的Theme。这样其他activity继承自BaseActivity就继承了其theme。
1
2
3
4
5
6
7
8
9public class BaseActivity extends FragmentActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // setTheme(R.style.BaseTheme); setContentView(R.layout.base_title); } }
但是这样做了之后就出现了一个问题,程序启动的时候,背景有闪烁,究其原因就是,我的BaseTheme继承自系统默认的
复制代码
这效果是显示系统默认的背景,也就是当我启动activity的时候,先出现了系统默认的背景,很快又在出现我自己设置的背景图片。这样效果就差了许多。
1android:Theme.NoTitleBar.Fullscreen
所以,在menifest中设置theme和在代码中设置theme还是有区别的,只能说明,manifest中设置的theme优先执行与在onCreate中设置的theme。所以还是老实的在manifest中的对应activity中设置theme吧。
最后
以上就是多情猫咪最近收集整理的关于为activity设置主题theme的全部内容,更多相关为activity设置主题theme内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复