要实现Android沉浸式状态栏,就不得不面对一大推兼容性问题。
下面两篇文章的做法或许大家都试过:
第一篇讲到了各种方法解决兼容性问题,不过太繁琐。第二篇文章干脆就复制粘贴一个工具类,相比下思路简单多了,但是要注意的地方也不少。不过他们都是为了兼容5.0以下才会有如此麻烦繁琐的步骤。举个例子,它们状态栏颜色要么是顶层布局的背景颜色,要么就是添加一个状态栏占位层,要么添加一堆难理解的代码,还要让状态栏显示高度在布局中设置android:fitsSystemWindows=“true”
等等一些操作。
我这里就教大家另外一种全新的方法:拒绝兼容5.0以下。这种方法更加简单、不需要考虑各种兼容问题。
首先,把我们工程最低兼容版本修改成api21:
android {
compileSdkVersion 27
defaultConfig {
applicationId "com.devnn.kotlindemo"
minSdkVersion 21
targetSdkVersion 27
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
其次,修改app主题,去掉actionbar。
一般我们都不用actionbar。不去掉也行,直接使用actionbar作为导航栏也可以。不影响。这里去掉会更加直观。
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
</style>
</resources>
最后,我们如果要修改状态栏的颜色就使用一句代码就行了:
kotlin:
//不管是否使用actionbar主题,下面这句代码都有效(api21及以上)
window.statusBarColor =ContextCompat.getColor(this,R.color.colorAccent)
java:
//不管是否使用actionbar主题,下面这句代码都有效(api21及以上)
getWindow().setStatusBarColor(ContextCompat.getColor(this,R.color.colorAccent))
其它的就什么也不需要做了。像android:fitsSystemWindows=“true”
也不要了。像状态栏高度也不用考虑了。
但是要注意的是,默认状态栏的颜色在主题样式中
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
这个配置的。而且状态栏颜色也跟activity顶层布局的背影颜色也没有关系。所以我们要设置状态栏颜色就必须通过全局主题配置,或者代码修改statusBarColor设置。
所以现在是不是省事很多了,activity代码也少了很多,项目更加整洁清晰了。