Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 安卓:全屏系统可视性拧紧窗口插入_Android_User Interface_Android Fragments - Fatal编程技术网

Android 安卓:全屏系统可视性拧紧窗口插入

Android 安卓:全屏系统可视性拧紧窗口插入,android,user-interface,android-fragments,Android,User Interface,Android Fragments,我正在编写一个应用程序,它有一个活动和一堆片段,其中一个片段是全屏的。为了实现这一点,我尝试使用系统UI可见性标志 对于全屏片段,我设置了可见性: layout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); 一旦我这样做,窗口插入的值就会变为似乎没有任何意义的值。然后,当我退出那个全屏片段时,我的视图上的填充错误(基于奇怪的插图

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

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

layout.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION);
一旦我这样做,窗口插入的值就会变为似乎没有任何意义的值。然后,当我退出那个全屏片段时,我的视图上的填充错误(基于奇怪的插图)

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

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


设置系统可见性()
将系统UI可见性更改向上传播到视图层次结构(以请求新插入)

但是,当您在片段的
onCreateView()
中调用
layout.setSystemMiviability()
时,
布局
尚未附加到视图层次结构。这就是导致插图未适当更新的原因


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

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

我调试并深入研究NavigationView的源代码,并找到以下解决方案:

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

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


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

    在visiblitytest项目中,我还解决了一些其他问题,这些问题不会影响insets问题:您的
    systemUiVisile
    默认为
    true
    ,即使您将系统UI隐藏在
    onCreateView()
    (可能是
    false
    ),您应该在
    onCreateView()中隐藏操作栏
    为了与按钮一致,您应该在
    onDestroyView()中重置系统UI/操作栏
    ,您应该确保您的操作栏与UI的可见性保持同步。我没有在onCreateView中隐藏系统UI,而是将片段的布局设置为
    View.system\u UI\u FLAG\u layout\u全屏视图。system\u UI\u FLAG\u layout\u hide\u导航
    ,它只告诉视图布局,就好像系统UI被隐藏一样。在单击按钮之前,我不会隐藏系统ui。这就是为什么systemUiVisible默认为true。从任何附加布局调用SetSystemMiviability()是相同的(请注意上的注释)在这一点上,它会立即设置系统UI的可见性——在未附加的视图中调用它是问题的根源。我不是说这不是问题所在,我只是说你关于我在onCreateView中隐藏系统UI的评论在技术上是不正确的。我没有在onCreateView中隐藏系统UI,我只是将布局设置为fullscreen.我将在回答部分对您的解决方案进行评论。啊,您更改了代码-您的原始代码没有使用
    布局
    标志。因此,我相信我已经完全按照您的说明进行了操作,但我仍然会出现一些奇怪的行为。当我加载全屏片段时,将其切换到全屏并返回,然后点击返回按钮tton,我明白了:我在Github上更新了代码。您以前的代码使用了
    layout.setSystemMiviability(View.SYSTEM\u UI\u FLAG\u FULLSCREEN\View.SYSTEM\u UI\u FLAG\u HIDE\u NAVIGATION);
    onCreateView()中
    ,您后来改为使用
    View.SYSTEM\u UI\u FLAG\u LAYOUT\u FULLSCREEN\View.SYSTEM\u UI\u FLAG\u LAYOUT\u HIDE\u NAVIGATION
    标志-从添加它们的位置删除现在添加的
    布局
    标志,解决了这个问题。您在这一行中到底想做什么?您是在谈论onCreate中对第23行的更改吗Vew?因为我在看区别,它是这样写的:
    layout.setSystemMiviability(View.SYSTEM\u UI\u FLAG\u layout\u FULLSCREEN\View.SYSTEM\u UI\u FLAG\u layout\u HIDE\u NAVIGATION);+getActivity().getWindow().getDecorView().setSystemMiviability(View.SYSTEM\u UI\u FLAG\u layout\u FULLSCREEN\u全屏\124; View.SYSTEM\u UI\u FLAG\u layout\u HIDE\u NAVIGATION)
    标记没有改变,只有调用
    设置系统兼容性的视图发生了改变。我在那里尝试的是在状态栏、操作栏和导航栏下面全屏布局片段。然后,当我删除该片段时,我希望上一个片段/活动返回到非全屏布局,并带有其布局适当调整为状态栏、操作栏和导航栏的正常插入。