前提
前两天刚写过一个沉浸状态栏的文章
地址:修改状态栏的颜色和字体颜色
今天拿来做适配,发现谷歌自家的,华为等品牌手机有虚拟按键,图中就能看出,虚拟按键完全把我的BottomNavigationView盖住了。
我是在style中设置沉浸效果,同时配合链接中的工具类进行部分机型的适配,是同样设置的请往下看解决方法。
style设置沉浸的代码
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
<!--Android 5.x开始需要把颜色设置透明,否则导航栏会呈现系统默认的浅灰色-->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
解决虚拟按键遮挡布局方法
修改style中的windowTranslucentNavigation
<item name="android:windowTranslucentNavigation">false</item>
修改之后,虚拟按键的确没有盖住布局了,可是我的状态栏不变色了
这里比较纳闷,只改了navigation而已,却影响到了statusBar。
解决状态栏沉浸失效方法
我们使用UI FLAG给布局添加SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN和SYSTEM_UI_FLAG_LAYOUT_STABLE,让布局占据状态栏的空间
注意,这两个必须结合使用。
/**
* style的windowTranslucentNavigation设置为false后,状态栏无法达到沉浸效果
* 设置UI FLAG 让布局能占据状态栏的空间,达到沉浸效果
*/
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
activity.getWindow().getDecorView().setSystemUiVisibility(option);
OK,现在状态栏是沉浸的效果,虚拟按键也不会遮挡我的布局。
总结
碰到这个问题,看的文章不下几十篇,因为业务代码写法的前提不同,需要解决的方式也不同。而且android版本跨度大,机型多,总有部分设备效果不尽如人意。而且UI FLAG的种类繁多,我看了源码也没搞清楚他们之间的关联~
希望各位有其他解决方法能和我交流