为activity设置主题theme

在实践中有这么一个需求,有一个BaseActivity,相同布局放置在这个Activity中,其他Activity继承自BaseActivity。为了使所有Activity都统一使用背景图片,一般做法是在BaseActivity的根布局中设置背景图片,但是这样会有一个不好的效果就是当程序第一次启动的时候也就是主Activity启动的时候,会有一阵黑屏时间,如果主Activity做的事情比较多的话,这个黑屏时间就会很长(直观感觉就是启动很慢)。于是有资料就说,自定义activity的theme,设置属性android:windowBackground为需要的背景图片,这样程序启动的时候,背景图片会立马显示出来,给人的感觉就是启动很快了。

于是按照上面所说的方法,自定义了一个theme,并在manifest中设置给主activity

styles文件中自定义theme

<style name="MyTheme" parent="android:Theme.NoTitleBar.Fullscreen"/>
    <style name="BaseTheme" parent="MyTheme">
        <item name="android:windowBackground">@mipmap/home_bg</item>
    </style>

manifest中设置

<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的。具体这样做:

public class BaseActivity extends FragmentActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//        setTheme(R.style.BaseTheme);
        setContentView(R.layout.base_title);
    }
}
就是在BaseActivity中的onCreate方法,在setContentView之前载入这个自定义的Theme。这样其他activity继承自BaseActivity就继承了其theme。

但是这样做了之后就出现了一个问题,程序启动的时候,背景有闪烁,究其原因就是,我的BaseTheme继承自系统默认的

android:Theme.NoTitleBar.Fullscreen
这效果是显示系统默认的背景,也就是当我启动activity的时候,先出现了系统默认的背景,很快又在出现我自己设置的背景图片。这样效果就差了许多。

所以,在menifest中设置theme和在代码中设置theme还是有区别的,只能说明,manifest中设置的theme优先执行与在onCreate中设置的theme。所以还是老实的在manifest中的对应activity中设置theme吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值