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

Transparent navigation bar is not transparent in split screen mode

我正在开发的一个应用程序在 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)中的错误,还是我遗漏了什么?导航栏在分屏模式下应该透明吗?如果不是,我如何可靠地确定我的视图的哪些部分将被系统栏遮挡?

由于我仍然无法解释所报告的值,我认为这是 Android.

的许多(如果不是全部)版本中存在的错误

此外,获得 window 插入的首选方法显然是覆盖 onApplyWindowsInsets() 并评估传递的 insets 参数(自 API 20 以来一直支持,而上述方式需要 API 23)。不幸的是,这似乎有 ,即报告不正确的顶部插图,但合并这两个结果对我有用。

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

组合值对我有用。