【问题标题】:Show Navigation Bar on Android KitKat after hiding it隐藏后在 Android KitKat 上显示导航栏
【发布时间】:2015-02-16 03:21:27
【问题描述】:

在我的应用中,我想让用户隐藏或显示导航栏(返回、主页、菜单)。系统栏(电池、wifi、通知)应始终隐藏。

我用这段代码隐藏了系统栏:

getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
            requestWindowFeature(Window.FEATURE_NO_TITLE);     

我成功地用这些标志隐藏了导航栏:

final static int flagsHide = 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;

但我还没有找到如何再次显示导航栏。我可以用标志来做到这一点还是我需要别的东西?系统栏必须保持不可见。

【问题讨论】:

    标签: android navigationbar


    【解决方案1】:

    使用此标志再次显示它

        SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN  |
     SYSTEM_UI_FLAG_LAYOUT_STABLE
    

    【讨论】:

    • 您好,感谢您的回复,但不幸的是没有这样做。导航栏仍处于隐藏状态。
    • 必须从这 3 个中删除 SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION 才能使其工作。
    • 有什么方法可以检查导航栏是否可见。我尝试了很多解决方案。但不工作。在自定义 ROM 中打开导航手势时,我正在检查导航栏的可见性
    【解决方案2】:

    我的一个解决方案。

    private void hideNavigationBar() {
        // set navigation bar status, remember to disable "setNavigationBarTintEnabled"
        final int flags = 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_IMMERSIVE_STICKY;
        // This work only for android 4.4+
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().getDecorView().setSystemUiVisibility(flags);
    
            // Code below is to handle presses of Volume up or Volume down.
            // Without this, after pressing volume buttons, the navigation bar will
            // show up and won't hide
            final View decorView = getWindow().getDecorView();
            decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
                @Override
                public void onSystemUiVisibilityChange(int visibility) {
                    if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                        decorView.setSystemUiVisibility(flags);
                    }
                }
            });
        }
    }
    
    private void showNavigationBar() {
        // set navigation bar status, remember to disable "setNavigationBarTintEnabled"
        final int flags = View.SYSTEM_UI_FLAG_LAYOUT_STABLE
                | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
                | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
                | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
        // This work only for android 4.4+
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
            getWindow().getDecorView().setSystemUiVisibility(flags);
    
            // Code below is to handle presses of Volume up or Volume down.
            // Without this, after pressing volume buttons, the navigation bar will
            // show up and won't hide
            final View decorView = getWindow().getDecorView();
            decorView.setOnSystemUiVisibilityChangeListener(new View.OnSystemUiVisibilityChangeListener() {
                @Override
                public void onSystemUiVisibilityChange(int visibility) {
                    if((visibility & View.SYSTEM_UI_FLAG_FULLSCREEN) == 0) {
                        decorView.setSystemUiVisibility(flags);
                    }
                }
            });
        }
    }
    

    区别是removing "View.SYSTEM_UI_FLAG_HIDE_NAVIGATION"

    【讨论】:

      【解决方案3】:

      这将有助于显示导航栏:-

      private void showSystemUI() {

      mDecorView.setSystemUiVisibility(
       View.SYSTEM_UI_FLAG_LAYOUT_STABLE
       | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
       | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
      

      }

      mDecorView 是你的父布局。 有关更多详细信息,请参阅此链接 https://developer.android.com/training/system-ui/immersive.html

      【讨论】:

        【解决方案4】:

        全屏模式

        activity.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.getWindow()
                .getDecorView()
                .setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
        

        【讨论】:

          【解决方案5】:

          我所有的项目都使用了最好的解决方案

          public final class SystemUIUtil {
          
          public static void hideDefaultControls(@NonNull final Activity activity) {
              final Window window = activity.getWindow();
          
              if (window == null) {
                  return;
              }
          
              window.clearFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
              window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
          
              final View decorView = window.getDecorView();
          
              if (decorView != null) {
                  int uiOptions = decorView.getSystemUiVisibility();
          
                  if (Build.VERSION.SDK_INT >= 14) {
                      uiOptions |= View.SYSTEM_UI_FLAG_LOW_PROFILE;
                  }
          
                  if (Build.VERSION.SDK_INT >= 16) {
                      uiOptions |= View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
                  }
          
                  if (Build.VERSION.SDK_INT >= 19) {
                      uiOptions |= View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
                  }
          
                  decorView.setSystemUiVisibility(uiOptions);
              }
          }
          
          public static void showDefaultControls(@NonNull final Activity activity) {
              final Window window = activity.getWindow();
          
              if (window == null) {
                  return;
              }
          
              window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
              window.addFlags(WindowManager.LayoutParams.FLAG_FORCE_NOT_FULLSCREEN);
          
              final View decorView = window.getDecorView();
          
              if (decorView != null) {
                  int uiOptions = decorView.getSystemUiVisibility();
          
                  if (Build.VERSION.SDK_INT >= 14) {
                      uiOptions &= ~View.SYSTEM_UI_FLAG_LOW_PROFILE;
                  }
          
                  if (Build.VERSION.SDK_INT >= 16) {
                      uiOptions &= ~View.SYSTEM_UI_FLAG_HIDE_NAVIGATION;
                  }
          
                  if (Build.VERSION.SDK_INT >= 19) {
                      uiOptions &= ~View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY;
                  }
          
                  decorView.setSystemUiVisibility(uiOptions);
              }
          }
          

          }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-02-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-23
            相关资源
            最近更新 更多