前言
沉浸式状态栏是一个好东西,但是使用起来并没有想象中的那样一帆风顺。
需要解决的问题
- 我希望状态栏是半透明的,而不仅是比主颜色深
- 在设置了一些 flag 以后,布局跑到了状态栏 / 导航栏底下
设置状态栏和导航栏透明
要使状态栏和导航栏透明,可以直接使用如下代码
以上代码做了:
- 如果系统版本在 LOLLIPOP 以上,则设置状态栏和导航栏的颜色为 color
其中 color 的格式为 ARGB,推荐使用 0×20000000 - 如果系统版本在 LOLLIPOP 以下,KITKA_WATCH 以上,则设置导航栏和状态栏为透明
其中的各种 flag 的作用不在这里介绍,详细请参照 Android Developer
解决布局进入状态栏 / 导航栏下方的问题
网上的文章提到了 fitsSystemWindows
这一个属性,但是使用起来我感觉不是特别的顺手,所以我翻看了安卓的源码。
其中 View.setFitsSystemWindows(boolean fitSystemWindows)
方法的源码如下
于是我顺着 FITS_SYSTEM_WINDOWS
这个 flag 向下搜索,找到了如下方法
接着我查找了该方法的调用,找到如下方法
于是接着查找调用
注意到这一句了吗
似乎在 WindowInsets
上可以做一点文章,所以我翻看了 WindowInsets
的源码
因为 WindowInsets
里面绝大部分方法都不能被访问,而且找不到对应的 getter,所以我查找了 WindowInsets 的使用,于是我发现了下面的接口
到这里已经能发现解决方案了。
解决方案
首先我们在 onCreate(Bundle savedInstanceState)
中获取根布局,即 setContentView(View view)
中的 view
接着我们对 rootView 设置 OnApplyWindowInsetsListener
写在最后
在这个研究完成后,我惊喜的发现如果此时 Activity 设置有
那么键盘弹出时布局会自动被压缩,一石二鸟。