美文网首页
Android 隐藏底部工具栏

Android 隐藏底部工具栏

作者: 光羽隼 | 来源:发表于2019-04-18 19:17 被阅读0次

    隐藏底部工具栏只有在能获取到Window的地方才能实现,比如果activity,dialog等
    在activity中隐藏底部工具栏的方法

    隐藏底部工具栏可以在任意的界面对象中实现,dialog,悬浮窗,等等,只要有view对象就可以。

     @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    //        getWindow().setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION,WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);//底部状态栏位置消失,但是状态栏还是存在
    //        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//底部状态栏位置消失,但是状态栏还是存在
    //        getWindow().setFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS,WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//底部状态栏位置消失,但是状态栏还是存在
    
    //这种方法也行,但是要在Android 4.0以上才能生效
    //        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);
    
            //取消标题
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            //取消状态栏
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
                    WindowManager.LayoutParams.FLAG_FULLSCREEN);
            //隐藏虚拟按键(底部工具栏),并且全屏
            if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) { // lower api
                View v = this.getWindow().getDecorView();
                v.setSystemUiVisibility(View.GONE);
            } else if (Build.VERSION.SDK_INT >= 19) {
                //for new api versions.
                View decorView = getWindow().getDecorView();
                int uiOptions = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
                        | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
                decorView.setSystemUiVisibility(uiOptions);
            }
        }
    

    在oncreate隐藏这个是没有问题,但是当我们需要弹出dialog(也调用了隐藏工具栏的方法)的时候,底部工具栏就会重新出现然后消失,dialog消失的时候,底部工具栏会再次出现,activity隐藏底部工具栏的设置就会失效,那我们就需要在焦点变化的时候调用。

     @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            if (hasFocus) {
                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);
            }
        }
    

    这样底部工具栏的设置就不会失效了。但是,在dialog出现和隐藏的瞬间,底部工具栏都会出现,很尴尬的问题,我慢慢再找解决方法吧,现在我是用悬浮窗代替一些不是全屏的dialog。

    提一下

    如果需要全屏的悬浮窗的时候,我们是不能隐藏工具栏占用的区域的,因为悬浮窗没有window对象,所以我现在把有问题的全屏悬浮窗都改成了dialog。
    一知半解真可怕,只会看博客,不自己看源码钻研真是尴尬,哎,是我理解错了,在隐藏底部工具栏的时候是通过调用setSystemUiVisibility(int)这个方法,这个方法我一直以为是window的方法。。。。其实是view的方法,那这样的话,我们就可以使用一个界面里的任意一个view对象调用此方法了。也就不会出现所谓的悬浮窗不能隐藏底部工具栏的问题了。只会复制,不认真看代码是一个非常非常蠢得行为!

    遗留问题:

    dialog显隐的时候,底部工具栏会出现一瞬间的闪现。(可以使用悬浮窗带滴dialog,但是没有解决根本问题)

    问题解决:

    在activity中打开dialog时,底部状态栏会出现然后消失。这个问题的解决是在dialog显示之前将dialog的焦点失能,然后在显示之后清理失能焦点。

     public void show(String type,String mes){
            //失能焦点
            getWindow().setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
                    WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
            super.show();
            //清理失能焦点
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
        }
    

    参考:android 隐藏底部的 菜单栏
    android隐藏底部虚拟键Navigation Bar实现全屏
    Android dialog 弹出时,保持 隐藏 navigation bar(虚拟栏)

    相关文章

      网友评论

          本文标题:Android 隐藏底部工具栏

          本文链接:https://www.haomeiwen.com/subject/lmxxgqtx.html