1

我目前有一个带有 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 中运行良好,但在片段中不执行任何操作。对于所有类似的 stackoverflow 答案,他们建议添加 getActivty() ,如下所示:

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

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

4

3 回答 3

3

在解决这个问题几天失败后,我终于决定回去阅读 android文档。所以我通过在活动的窗口焦点发生变化时启用粘性沉浸模式来解决问题,如下所示:

@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);
}

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

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

于 2018-08-09T19:24:27.097 回答
1

在片段中,首先获取 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()方法中添加这段代码。

于 2019-02-18T12:33:23.803 回答
0

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

于 2018-08-04T14:32:11.337 回答