美文网首页
Activity刘海、全屏模式设置,隐藏底部虚拟导航。

Activity刘海、全屏模式设置,隐藏底部虚拟导航。

作者: 主音King | 来源:发表于2019-07-30 20:09 被阅读0次

    刘海屏幕
    对于华为20pro,在设置-->显示-->更多显示设置-->选择 默认(为应用自动匹配顶部显示,尽可能地利用屏幕空间,使内容不被遮挡)
    或者选择 隐藏顶部区域(屏幕顶部始终不作为显示区域,会导致竖屏进入刘海区域,横屏不进入刘海区域)

    activity隐藏底部虚拟导航(比如华为):
    在onResume和onWindowFocusChanged中写入:

        @Override
        protected void onResume() {
            super.onResume();
            SystemNavigationUtils.hideSystemNavigationBar(getWindow());
        }
    
        @Override
        protected void onDestroy() {
            AppManager.getAppManager().finishActivity(this);
            super.onDestroy();
        }
    
        @Override
        public void onWindowFocusChanged(boolean hasFocus) {
            super.onWindowFocusChanged(hasFocus);
            if (hasFocus && Build.VERSION.SDK_INT >= 19)
                SystemNavigationUtils.hideSystemNavigationBar(getWindow());
        }
    
        public static void hideSystemNavigationBar(Window window) {
            if (window != null) {
                if (Build.VERSION.SDK_INT > 11 && Build.VERSION.SDK_INT < 19) {
                    View view = window.getDecorView();
                    view.setSystemUiVisibility(View.GONE);
                } else {
                    WindowManager.LayoutParams params = window.getAttributes();
                    params.systemUiVisibility = View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY | View.SYSTEM_UI_FLAG_FULLSCREEN;
                }
            }
        }
    

    dialog:弹窗,在有底部虚拟导航按钮(在全屏模式中,比如华为:闪烁问题)。
    处理办法重写dialog的show方法:

     @Override
        public void show() {
            Window window = getWindow();
            if (window != null) {
                window.setFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
                View decor = window.getDecorView();
                if (decor != null) {
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
                        decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
                    } else {
                        decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION);
                    }
                }
                super.show();
                window.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE);
            } else {
                super.show();
            }
        }
    

    通过清单style设置全屏幕

        <style name="FullActivityTheme" parent="AppTheme">
    // 全屏设置
            <item name="android:windowFullscreen">true</item>
    // 无title
            <item name="android:windowNoTitle">true</item>
    // 半透明状态
            <item name="android:windowTranslucentStatus">true</item>
            <item name="android:windowTranslucentNavigation">true</item>
        </style>
    

    如果只设置

        <style name="FullActivityTheme" parent="AppTheme">
    // 全屏设置
            <item name="android:windowFullscreen">true</item>
    // 无title
            <item name="android:windowNoTitle">true</item>
        </style>
    

    会发现在刘海屏手机上有一段灰白色区域(action_model_bar-stub:ViewStubComat)位置, xml自己的布局会往下挤一段距离高度。
    如果设置上了则该位置为(0,0,0,0),实现了真正意义上的全屏。
    为何取名为透明?好奇怪,它的确有实际高度,设置为true了就无实际高度。

    相关文章

      网友评论

          本文标题:Activity刘海、全屏模式设置,隐藏底部虚拟导航。

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