我正在使用的应用在支持该功能的Android版本上使用透明的系统栏。这是通过以下样式定义完成的:
<item name="android:navigationBarColor">@android:color/transparent</item>
<item name="android:statusBarColor">@android:color/transparent</item>
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
以及以下代码:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) {
/* Make system bars fully transparent */
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
}
在正常模式下,这可以按预期工作:状态和导航栏都覆盖在应用内容上。
在分屏模式下,此功能适用于状态栏,但不适用于导航栏:在纵向模式下,当应用程序位于底部时,导航栏为黑色,但是getWindow().getDecorView().getRootWindowInsets().getSystemWindowInsetBottom()
报告为144像素。装饰视图的高度比根视图的高度小144像素(在没有分屏的情况下,它们都相等,因为该应用程序没有操作栏)。当应用程序位于右侧(如导航栏)时,在横向模式下也会出现类似的症状。
添加View.SYSTEM_UI_FLAG_LAYOUT_STABLE
标志没有任何效果。
该设备是智能手机,即默认为纵向且在横向模式下会在侧面显示导航栏的设备。
这是否是我正在使用的Android发行版中的错误(LineageOS 15.1,Android 8.1.0),还是我缺少某些东西?导航栏在分屏模式下应该透明吗?如果没有,如何可靠地确定系统栏将遮挡视图的哪些部分?
答案 0 :(得分:0)
由于我仍然无法解释所报告的值,因此我认为这是许多(如果不是全部)Android版本中存在的错误。
此外,显然,获取窗口插图的首选方法是覆盖onApplyWindowsInsets()
并评估传递的insets
参数(自API 20开始受支持,而上述方法需要API 23)。不幸的是,这似乎有some bugs of its own,即报告了错误的顶部插图,但是将这两个结果合并对我有用。
onApplyWindowsInsets()
的插图,仅丢弃最上面的一个。View#getRootWindowInsets()
来获得顶部插图。合并的值对我有用。