如何在代码中动态改变 colorPrimaryDark 颜色 也就是标题栏颜色?

5.0的标题栏颜色只能通过在style中设定吗?能不能代码动态设置?
除了StatusBarTintManager

阅读 13.1k
3 个回答

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {

        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.setStatusBarColor(Color.TRANSPARENT);   //这里动态修改颜色
    }

弄清楚“colorPrimaryDark”是状态栏颜色,就可以通过动态改变“colorPrimaryDark”来实现沉浸式状态栏。
1、首先不再使用ActionBar,“styles.xml”中对主题应该进行修改。

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    <item name="colorPrimary">@color/colorPrimary</item>
    <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
    <item name="colorAccent">@color/colorAccent</item>

    <item name="windowNoTitle">true</item>
    <item name="windowActionBar">false</item>
</style>

2、每个Activity继承BaseActivity重写getStatusBarColor

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            Window window = getWindow();
            window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
                    | WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
            window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            window.setStatusBarColor(getStatusBarColor());
        }
    }

    protected abstract int getStatusBarColor();
}

通过这种方式实现沉浸式状态栏是否可行?期待各位路过的朋友发表发表看法。

推荐问题
宣传栏