代码之家  ›  专栏  ›  技术社区  ›  Davi

无法从片段中隐藏导航栏

  •  1
  • Davi  · 技术社区  · 7 年前

    我现在有一个带有片段statepageradapter的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 回复  |  直到 7 年前
        1
  •  2
  •   Davi    7 年前

    在解决这个问题失败了几天之后,我终于决定回去看看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
                        // 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。

        2
  •  0
  •   Viswanath Kumar Sandu    7 年前

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

        3
  •  0
  •   Akshatha S R    7 年前

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

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