无法从片段中隐藏导航栏

Cannot hide navigation bar from inside a fragment

我目前有一个带有 FragmentStatePagerAdapter 的 ViewPager。这里的问题是每次点击按钮都会出现一个导航栏,所以我开始用下面的代码手动隐藏它:

getWindow().getDecorView().setSystemUiVisibility(
                                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

此代码片段在 activity 中运行良好,但在片段中不执行任何操作。对于所有类似的 Whosebug 答案,他们建议添加 getActivty() 如下所示:

getActivity().getWindow().getDecorView()………..

但出于某种原因它仍然没有隐藏导航栏

由于Viewpager同时调用了多个fragment,viewpager的高度无法更改。因此不会有任何影响。所以最好从 activity 或包含 viewpager 的片段来处理它。

这几天没解决这个问题,我终于决定回去看看android documentation。所以我通过在 activity 的 window 焦点改变时启用粘性沉浸模式解决了这个问题,如下所示:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
// I removed the below condition check because I still want to hide System UI even if activity
// loses focus. Such cases include spinner dropdown list is open, dialog box is displayed, etc.
// if(hasFocus)
    hideSystemUI();
}

private void hideSystemUI() {
    // Enables sticky immersive mode.
    // For "lean back" mode, remove SYSTEM_UI_FLAG_IMMERSIVE_STICKY.
    // Or for "regular immersive," replace it with SYSTEM_UI_FLAG_IMMERSIVE
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
                    View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY
                    // Set the content to appear under the system bars so that the
                    // content doesn't resize when the system bars hide and show.
                    | View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    // Hide the nav bar and status bar
                    | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_FULLSCREEN);
}

// Shows the system bars by removing all the flags
// except for the ones that make the content appear under the system bars.
private void showSystemUI() {
    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(
            View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                    | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
}

注意:我启用粘性沉浸模式而不是常规沉浸模式的原因是在常规沉浸模式下,非半透明导航栏将在用户手势时永久显示从下到上。但是在粘性沉浸模式下,会临时显示一个半透明的导航栏。

更新:我忘了link这个问题。由于即使焦点更改是由片段任务引起的 onWindowFocusChanged(boolean hasFocus) 也会被触发,因此无需从片段内部隐藏系统 UI。

在片段中,首先获取 Activity 的上下文,然后在该上下文上隐藏软导航键..

getActivity().getWindow().getDecorView().setSystemUiVisibility(
                                View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                                        | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                                        | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                                        | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                                        | View.SYSTEM_UI_FLAG_FULLSCREEN
                                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);

将这段代码添加到片段的 onCreateView() 方法中。