ustcrding 2020-06-03
很多UI设计都要求修改状态栏的一些颜色、字体颜色、沉浸式等等效果。但是状态栏开发收到各种Android版本影响,在匹配的时候十分复杂。并且国内的各种设备商前几年疯狂修改Android系统代码,导致状态栏适配更加复杂。而且实现状态栏开发的方式google本身就提供多种多样方式。这篇博客就重点整理所有状态栏开发方式。但是,代码还是以适配google原生系统的为主,其他国内设备瞎搞还是先放一放。
在app创建后在styles文件里的AppTheme(这个是默认主题,如果你修改为了其他你自定义的主题,以你的主题为标准)主题下colorPrimaryDark属性,它是作用于状态栏的颜色值,参考下图了解每一个属性作用域:
修改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"> <!--在这里设置全局主题-->
效果图:
一个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); }
效果图:
End