如何设置完全透明的导航栏(NOT TRANSLUCENT)并继续接收 window 插图更新

How to set completely transparent navigation bar (NOT TRANSLUCENT) and keep receiving window inset updates

下面的图片基本上是我的目标,一个完全透明的导航栏(不是半透明的)并且它后面的内容不断得到插入更新所以它在它后面绘制,但没有得到任何 UI 覆盖导航控件。

到目前为止,实现上图中结果的唯一方法是将标志 FLAG_LAYOUT_NO_LIMITS 设置为 activity。问题是完成后,如果启用了手势导航,应用程序将不再接收任何插图,但手势插图除外。

我已经尝试了所有我能想到的组合,但到目前为止我完全无法实现100%透明导航栏+ window insets。

我假设设置该标志时导航栏不透明的原因是因为系统 window insets 现在为 0,因此半透明区域缩小到 0 高度,使导航控件没有背景.

我也试过设置

<item name="android:navigationBarColor">@android:color/transparent</item>

然而,所有这一切只是让导航栏完全变白,内容不会显示在它后面。

而且我还为我进行的所有测试启用和禁用了以下功能

<item name="android:windowDrawsSystemBarBackgrounds">true</item>

我已经研究了 Window 插图的噩梦,并且有一种方法可以通过 getWindow().getDecorView().getRootWindowInsets() 找到 window 插图,但是我将陷入以下问题在不需要时添加插图(例如,多 window 模式),但我仍然无法获得 window 插图更新,例如在打开键盘时。

我看过 (@chris-banes) Chris Banes 的 "Becoming a master window fitter",但是这个特定场景从未被涵盖。

这不可能吗?我们可以为状态栏实现这个结果,但我们永远无法为导航栏做同样的事情?如果没有,那如何实现?

我想要的只是一个 100% 透明(不是半透明)的导航栏,并且应用程序不断接收 window 插图,其中包含预期值而不是所有值的 0。

Chris Banes 还有一个更新的博客 post,详细介绍了您的要求: https://medium.com/androiddevelopers/windowinsets-listeners-to-layouts-8f9ccc8fa4d1

简而言之,在根视图上设置以下系统 ui 标志:

rootView.systemUiVisibility = View.SYSTEM_UI_FLAG_LAYOUT_STABLE or
        View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION

得到如下结果:

然后您可以更新视图的填充或边距,通过添加 onApplyWindowInsetsListener:

使其可用于触摸事件
bottomNav.setOnApplyWindowInsetsListener { view, insets ->
    view.updatePadding(bottom = insets.systemWindowInsetBottom)
    insets
}

对于完整的解决方案,我建议您阅读整个 post,这是一本很好的书,对我帮助很大。