转载请注明出处,谢谢:https://www.jianshu.com/p/e6d84f0c9610
这篇文章解释了我们在适配过程中使用的几个属性的含义,如果对这些属性不感兴趣或者已经知道这些属性的含义,可以直接跳转至文章最后的参考文献。
我们在实现功能的过程中,不要只是拷贝代码。如果不知道这些属性的含义。 出bug了,我们也不会怎么排除,这就尴尬了。
就目前安卓已经大范围使用的版本为止(7.0)。我们要考虑的是4.4 (API19)以前的版本、5.0以上的版本。 考虑4.4版本是因为 4.4 以上的版本不能够实现沉浸式状态栏, 考虑5.0 是因为,该版本以后,会默认覆盖一个半透明蒙层。
因此,我们需要三个版本的 value style: vaules、values-19、vallues-21。

其中,每个属性的含义为:
TranslucentTheme 是我们定义的appTheme,通常如果不单独设置theme,我们所有的界面都会继承自这个Theme。
windowTranslucentStatus 这个属性表示我们是否可以把Activity的显示区域范围扩展到 StatusBar。 true 表示使用statusBar作为内容区域 false 表示不可以 将其作为内容区域
windowTranslucentNavigation 和上面的属性类似,该属性表示是否将页面的内容扩展至最下面的虚拟键盘,即是否将虚拟键盘显示的区域作为内容区域。
statusBarColor 这个属性表示,我们可以设置状态栏颜色,像注释中写的那样,该属性是在5.0以上的机型中提供的属性。如果不设置,默认会在状态栏上有一个蒙层。
需要注意的是我们在配置这三个文件的时候,一定要注意相同的属性,在不同的文件中设置的是否相同。
否则一定会出现意想不到的问题的。 别问我怎么知道的, 已经哭晕在厕所。
若 我们不希望布局扩展到StatusBar同时有希望改变状态栏的颜色, 我们可以设置 fitsSystemWindows 这个属性。
fitsSystemWindows 设置该属性为true, 即将我们的Activity的内容区域限制在StatusBar之外,会在最上层添加一个padding,高度为状态栏的高度。 这样,StatusBar就不会显示我们的内容了。 但是如果我们同时设置了windowTranslucentStatus 属性,那么就会造成状态栏的背景颜色和Activity的背景颜色是一致的。
解决办法是我们设置Activity的背景颜色,在下方的内容区域再设置对应的背景颜色。 但是这样会造成过度绘制。并不是最佳的解决办法。 同时,如果设置了fitsSystemWindows属性,却不设置背景颜色的话,还会造成使用软件盘的时候,整个的内容区域都会被顶上去...
代码中处理
当然,我们也可以在代码中进行相应的操作。下面两篇文章讲的非常详细,可以参考下。其中的属性组合设置和我们在xml中配置的含义相同。
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS == windowTranslucentStatus
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN : Activity全屏显示,但是状态栏不会被覆盖掉,而是正常显示,只是Activity顶端布局会被覆盖住 该属性,要和其他几个属性相区别:
View.SYSTEM_UI_FLAG_FULLSCREEN :Activity全屏显示,且状态栏被覆盖掉.
View.SYSTEM_UI_FLAG_VISIBLE :状态栏和Activity共存,Activity不全屏显示。也就是应用平常的显示画面
View.INVISIBLE : Activity全屏显示,隐藏状态栏
View.SYSTEM_UI_FLAG_HIDE_NAVIGATION:隐藏虚拟按键(导航栏)。有些手机会用虚拟按键来代替物理按键
View.SYSTEM_UI_FLAG_LAYOUT_STABLE: 保持View Layout不变,隐藏状态栏或者导航栏后,View不会拉伸
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN:让View全屏显示,Layout会被拉伸到StatusBar下面,不包含NavigationBar。
View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION:让View全屏显示,Layout会被拉伸到StatusBar和NavigationBar下面。
还有一些其他的属性,具体参看下面参看参考文档的第三篇,具体要立哪个flag,就看业务需求了。
写在最后 - 其实沉浸式状态栏并没有那么难,只要我们搞清楚各个属性代表什么意思,根据也无需求进行相应的设置,就可以了。少年们,要加油哦。
更新下,在不同版本下配置 xml 来实现沉浸式状态栏,会导致如果我们在没有指定默认dialog样式,在不同版本的手机上会显示不同样式的dialog的问题。如果使用代码方式配置不会出现这个问题。
网友评论