Android开发 状态栏开发

ustcrding 2020-06-03

前言

很多UI设计都要求修改状态栏的一些颜色、字体颜色、沉浸式等等效果。但是状态栏开发收到各种Android版本影响,在匹配的时候十分复杂。并且国内的各种设备商前几年疯狂修改Android系统代码,导致状态栏适配更加复杂。而且实现状态栏开发的方式google本身就提供多种多样方式。这篇博客就重点整理所有状态栏开发方式。但是,代码还是以适配google原生系统的为主,其他国内设备瞎搞还是先放一放。

改变colorPrimaryDark颜色, 从而改变状态栏颜色

 在app创建后在styles文件里的AppTheme(这个是默认主题,如果你修改为了其他你自定义的主题,以你的主题为标准)主题下colorPrimaryDark属性,它是作用于状态栏的颜色值,参考下图了解每一个属性作用域:

Android开发 状态栏开发

改变colorPrimaryDark从而改变全局App状态栏颜色

修改colorPrimaryDark改变状态栏颜色,这是最简单的方式,可以把全局App的每个页面的状态栏颜色都修改成指定颜色,代码如下:

styles.xml

这里将状态栏修改成黄色

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">#FF9800</item> <!--修改的黄色颜色值,这里只是举例。实际项目还是把颜色值老老实实地放在color文件里-->
        <item name="colorAccent">@color/colorAccent</item>
    </style>

注意,这个主题要设置成app全局主题,在AndroidManifest里设置。

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.yt.modeldemo">

    <application
        android:allowBackup="true"
        android:hardwareAccelerated="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"> <!--在这里设置全局主题-->

效果图:

Android开发 状态栏开发

修改colorPrimaryDark,改变某一个Activity的状态栏颜色

一个app全局只使用一种状态栏颜色,这只是一个美好的愿望。 实际项目十分蛋疼,各种activity都需要各种颜色的状态栏。我们可以创建一个新的主题改变colorPrimaryDark颜色后,给这个activity使用。代码如下:

styles.xml

<!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">#FF9800</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="MainActivityTheme" parent="AppTheme"> <!--其他属性的颜色,我们依然需要使用全局AppTheme,所以这里直接引用它-->
        <item name="colorPrimaryDark">#2196F3</item> <!--修改这MainActivity需要使用的状态栏颜色-->
    </style>

AndroidManifest.xml

找到需要设置的activity,将主题设置给它。

<activity android:name=".MainActivity"
            android:theme="@style/MainActivityTheme"> <!--设置这个activity的主题-->
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

在activity里:

当然除了在AndroidManifest.xml里设置,我们还可以直接在代码了里直接设置这个主题。请注意!代码里设置主题一定要在 setContentView(R.layout.activity_main); 方法前面。(喜欢搞BaseActivity封装setContentView的同学注意了!你们这就是脱裤子放屁多此一举,反而在会影响别人设置setTheme,深刻了解什么是过度封装,什么代码统一一个地方修改全局,那也得看看是什么形式的封装,google直接在创建Activity的时候都帮你写好了,你这么厉害怎么不去google?)

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setTheme(R.style.MainActivityTheme);//设置主题,一定要在setContentView前面
        setContentView(R.layout.activity_main);
    }

效果图:

Android开发 状态栏开发

End

相关推荐