无法从片段内部隐藏导航栏

时间:2018-08-02 21:20:14

标签: android android-fragments android-navigation-bar

我目前有一个带有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);

此代码段在活动中可以正常运行,但不会在片段中执行任何操作。对于所有类似的stackoverflow答案,他们建议添加如下所示的getActivty():

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

出于某些原因,它仍然没有隐藏导航栏

3 个答案:

答案 0 :(得分:2)

在解决了这一问题几天后,我终于决定回去阅读Android documentation。因此,我通过在活动的窗口焦点发生更改时启用粘性沉浸模式来解决该问题,如下所示:

@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
                    | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                    // 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);
}

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

更新:我忘了将其链接到问题。因为即使焦点更改是由片段任务引起的,也会触发onWindowFocusChanged(boolean hasFocus),所以无需从片段内部隐藏系统UI。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

在片段中,首先获取“活动”的上下文,然后在该上下文上方隐藏软导航键。

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()方法中。