【问题标题】:Android : Fullscreen system visibility screws up window insetsAndroid:全屏系统可见性搞砸了窗口插图
【发布时间】:2016-03-30 11:17:16
【问题描述】:

我正在编写一个具有一个活动和一堆片段的应用程序,其中一个片段是全屏的。为了实现这一点,我正在尝试使用 System UI Visibility 标志。

对于全屏片段,我设置了可见性:

layout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);

只要我这样做,窗口插图就会更改为似乎没有任何意义的值。然后,当我退出该全屏片段时,我的视图上的填充错误(基于奇怪的插图)

有人知道这里发生了什么吗?我理解窗口插图的方式一定是错误的,因为这种行为似乎完全违反直觉。任何见解将不胜感激。

要查看我为说明问题而编写的测试应用程序的完整源代码,请转到此处:

https://github.com/dapp/visibilitytest

【问题讨论】:

  • 我会在您的 visiblitytest 项目中修复一些其他不影响插入问题的问题:即使您在 @987654329 中隐藏系统 UI,您的 systemUiVisile 默认为 true @(应该是false),你应该隐藏onCreateView()中的动作栏以与按钮保持一致,你应该重置onDestroyView()中的systemUI/action bar,你应该respond to UI visibility changes以确保你的动作栏与 UI 可见性保持同步。
  • 我没有在 onCreateView 中隐藏系统 ui,而是将片段的布局设置为 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION,这只会告诉视图布局 好像系统 ui 被隐藏。在单击按钮之前,我实际上并没有隐藏系统 ui。这就是 systemUiVisible 默认为 true 的原因。
  • 从任何附加布局调用 setSystemUiVisibility() 是相同的(注意the training sample 上的注释),因为它立即设置系统 UI 可见性 - 在未附加视图上调用它是问题的根源。
  • 我并不是说这不是问题,我只是说您在 onCreateView 中隐藏系统 ui 的评论在技术上不正确。我没有在 onCreateView 中隐藏系统 ui,我只是将布局设置为全屏。我会在答案部分评论您的解决方案。
  • 啊,您更改了代码 - 您的原始代码没有使用 LAYOUT 标志。

标签: android user-interface android-fragments


【解决方案1】:

我今天也有同样的问题。我正在使用设计库中的 NavigationView。当我退出全屏时,NavigationView的顶部和底部都有虫子,很难看。

我调试并挖掘了 NavigationView 的源代码并找到了以下解决方案:

  1. 请为您的视图使用 setFitsSystemWindows(false) 方法,在我的例子中,对于 NavigationView,以避免状态栏和导航栏更改的影响。

  2. 我发现 NavigationView 的超类:ScrimInsetsFrameLayout 中有 OnApplyWindowInsetsListener,然后我使用 ViewCompat.setOnApplyWindowInsetsListener(mNavigationView, null) 清除此侦听器以避免在启用/禁用全屏时产生影响。

现在 NavigationView 在退出全屏时表现正常,希望这对您的问题有所帮助。

【讨论】:

    【解决方案2】:

    setSystemUiVisibility() 向上传播系统 UI 可见性更改视图层次结构(以请求新的插入)。

    但是,当您在 Fragment 的 onCreateView() 中调用 layout.setSystemUiVisibility() 时,layout 尚未附加到视图层次结构。这就是导致您的插图未正确更新的问题。

    您可以改为在onCreateView() 中调用getActivity().getWindow().getDecorView().setSystemUiVisibility(),您会发现所有插入都正常工作。

    【讨论】:

    • 所以,我相信我完全按照您的指示进行了操作,但最终还是会出现一些奇怪的行为。当我加载全屏片段,将其切换到全屏并返回,然后点击返回按钮时,我得到了这个:imgur.com/m5HDl7F我在 Github 上更新了代码。
    • 您之前的代码在您的onCreateView() 中使用layout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);,此后您已更改为使用View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 标志 - 从您添加它们的位置删除现在添加的LAYOUT 标志修复了问题。你到底想在那条线上做什么?
    • 您是在谈论 onCreateVew 中对第 23 行的更改吗?因为我正在查看差异,它显示:layout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); + getActivity().getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 标志没有改变,只有调用 setSystemUiVisibility 的视图发生了变化。
    • 我想要做的是全屏布局片段,在状态栏、操作栏和导航栏下方。然后,当我删除该片段时,我希望前一个片段/活动返回到非全屏布局,其布局适当调整为状态栏、操作栏和导航栏的正常插入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    相关资源
    最近更新 更多