android隐藏状态栏和底部导航栏

臧俊杰
2023-12-01

前言

相信几乎每个项目都可能会遇到隐藏或者适配状态栏和导航栏的需求,尤其是面对如今手机款式多种多样情况下,使得一些以前起作用的方法如今用起来可能并不奏效,经过自己的寻找和尝试下,特此记录此次的解决方案。

隐藏状态栏(适配刘海屏、水滴屏,API 21以上)

第一步,使状态栏透明:(在Activity的onCreate方法调用)

/**
 * 1.使状态栏透明
 * @param window
 */
private static void setTransparent(@NonNull Window window) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
        window.setStatusBarColor(Color.TRANSPARENT);
    }
}

第二步,适配刘海屏:

private static void adaptAndroidP(@NonNull Window window) {
    // 适配刘海屏,全屏去黑状态栏
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
        WindowManager.LayoutParams layoutParams = window.getAttributes();
        layoutParams.layoutInDisplayCutoutMode =
                WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
        window.setAttributes(layoutParams);
    }
}

通过这两步操作,一般都可以实现隐藏状态栏,亲测有效。

隐藏底部导航栏

	//重写Activity该方法,当窗口焦点变化时自动隐藏system bar,这样可以排除在弹出dialog和menu时,
    //system bar会重新显示的问题(弹出dialog时似乎还是可以重新显示的0.0)。
    @Override
    public void onWindowFocusChanged(boolean hasFocus) {
        super.onWindowFocusChanged(hasFocus);
        if (hasFocus) {
            hideSystemUI();
        }
    }

    private void hideSystemUI() {
        View decorView = getWindow().getDecorView();
        decorView.setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY //(修改这个选项,可以设置不同模式)
                        //使用下面三个参数,可以使内容显示在system bar的下面,防止system bar显示或
                        //隐藏时,Activity的大小被resize。
                        | 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);
    }

以上这个方法可以实现同时隐藏状态栏和底部虚拟键导航栏!不知适配效果如何,暂且记录下来!

 类似资料: