透明导航栏在分屏模式下不透明

时间:2019-02-05 22:15:57

标签: android user-interface transparency

我正在使用的应用在支持该功能的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),还是我缺少某些东西?导航栏在分屏模式下应该透明吗?如果没有,如何可靠地确定系统栏将遮挡视图的哪些部分?

1 个答案:

答案 0 :(得分:0)

由于我仍然无法解释所报告的值,因此我认为这是许多(如果不是全部)Android版本中存在的错误。

此外,显然,获取窗口插图的首选方法是覆盖onApplyWindowsInsets()并评估传递的insets参数(自API 20开始受支持,而上述方法需要API 23)。不幸的是,这似乎有some bugs of its own,即报告了错误的顶部插图,但是将这两个结果合并对我有用。

  • 存储传递给onApplyWindowsInsets()的插图,仅丢弃最上面的一个。
  • 使用存储的值,并依靠View#getRootWindowInsets()来获得顶部插图。

合并的值对我有用。