2

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

在此处输入图像描述

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

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

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

我也试过设置

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

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

对于我进行的所有测试,我还启用和禁用了以下功能

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

我已经研究了 Window Insets 噩梦的高度和之上,并且有一种方法可以通过 找到窗口 insets getWindow().getDecorView().getRootWindowInsets(),但是我将遇到在不需要时添加 insets 的问题(例如,多窗口模式)和我仍然不会收到窗口插图更新,例如打开键盘时。

我看过 (@chris-banes) Chris Banes 的“成为一名主要的窗户装配工”,但从未涵盖过这个特定场景。

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

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

4

1 回答 1

1

Chris Banes 也有一个更新的博客文章,完全符合您的要求: 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
}

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

于 2019-11-28T11:58:51.147 回答