安卓系统:全屏系统可见性导致窗口插入问题

5
我是一名有用的助手,可以为您进行文本翻译。以下是需要翻译的内容:

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

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

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

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

enter image description here

有人知道这里发生了什么吗?我对窗口嵌入似乎理解有误,因为这种行为看起来完全不合常理。任何见解都将不胜感激。

要查看我编写的用于说明问题的测试应用程序的完整源代码,请点击此处:

https://github.com/dapp/visibilitytest


在你的visibilitytest项目中,除了影响插图问题之外,我还有一些其他的东西需要修复:即使你在onCreateView()中隐藏系统UI,你的systemUiVisile默认为true(应该是false),你应该在onCreateView()中隐藏操作栏以保持一致,你应该在onDestroyView()中重置系统UI/操作栏,并且你应该响应UI可见性变化以确保你的操作栏与UI可见性保持同步。 - ianhanniballake
我不会在onCreateView中隐藏系统UI,相反,我将片段的布局设置为View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION这只是告诉视图以好像系统UI已被隐藏的方式进行布局。 直到单击按钮,我才会实际隐藏系统UI。 这就是为什么systemUiVisible默认为true的原因。 - M Dapp
从任何附加的布局中调用setSystemUiVisibility()是相同的(请注意培训示例上的注释),因为它立即设置系统UI可见性 - 在未附加视图上调用它是问题的根源。 - ianhanniballake
我并不是说那不是问题,我只是想说你在onCreateView中评论我隐藏了系统UI并不准确。我并没有在onCreateView中隐藏系统UI,我只是将布局设置为全屏。我会在答案部分评论你的解决方案。 - M Dapp
啊,你改了代码 - 你原来的代码没有使用LAYOUT标志。 - ianhanniballake
显示剩余3条评论
2个回答

1
我今天遇到了同样的问题。我正在使用设计库中的NavigationView。当我退出全屏时,NavigationView顶部和底部会出现昆虫,很难看。
我进行了调试并深入研究了NavigationView的源代码,找到了以下解决方案:
  1. 请为您的视图使用setFitsSystemWindows(false)方法,对于我的情况,是NavigationView,以避免状态栏和导航栏更改的影响。
  2. 我发现NavigationView的超类ScrimInsetsFrameLayout中有OnApplyWindowInsetsListener,然后我使用ViewCompat.setOnApplyWindowInsetsListener(mNavigationView, null)清除此侦听器,以避免启用/禁用全屏时的影响。
现在,当退出全屏时,NavigationView的行为是正确的,希望这可以解决您的问题。

0

setSystemUiVisibility() 方法会将系统 UI 可见性更改传播到视图层次结构中(以请求新的插入)。

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

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


所以,我相信我已经完全按照您的指示进行了操作,但是我仍然遇到一些奇怪的行为。当我加载全屏片段,将其切换到全屏模式,然后再按返回按钮时,会出现这种情况:http://imgur.com/m5HDl7F我已在Github上更新了代码。 - M Dapp
你之前的代码在 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 标志可以解决问题。你在那一行代码中到底想做什么? - ianhanniballake
你是在说onCreateView中第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的视图发生了改变。
- M Dapp
我想要做的是将片段全屏布局,放在状态栏、操作栏和导航栏下面。然后当我移除该片段时,我希望之前的片段/活动返回到非全屏布局,并且其布局适当地调整为状态栏、操作栏和导航栏的正常插图。 - M Dapp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接