Step1

首先将theme改为继承NoActionBar类型,用自己的布局来实现titleBar,如:

<style name="Theme.Test" parent="Theme.MaterialComponents.Light.NoActionBar.Bridge">

Step2

创建一个BaseActivity继承AppCompatActivity,在其中写一个immersion方法来实现沉浸式

/**
     * 沉浸状态栏
     * @param window getWindow
     * @param isDarkStatusBarText 状态栏的字体颜色是亮色还是暗色 true:暗色  false:亮色
     */
    protected void immersion(Window window, boolean isDarkStatusBarText) {
        if (window == null) {
            return;
        }

        //关键代码,沉浸(内容扩展到状态栏)
        WindowCompat.setDecorFitsSystemWindows(window, false);

        //设置状态栏和导航栏的底色,透明
        window.setStatusBarColor(Color.TRANSPARENT);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            window.setNavigationBarDividerColor(Color.TRANSPARENT);
        }

        //设置沉浸后状态栏字体的颜色
        WindowInsetsControllerCompat insetsController = WindowCompat.getInsetsController(window, findViewById(android.R.id.content));
        insetsController.setAppearanceLightStatusBars(isDarkStatusBarText);
    }

如果App中所有页面的titleBar都是统一的颜色,可以在BaseActivity中的onCreate中直接调用,如下:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        immersion(getWindow(), false);
    }

其他的Activity全部继承BaseActiviy即可,当然还需要各自Activity的布局中实现自定义titleBar,不然内容就顶到状态栏里去了

效果展示:

1、isDarkStatusBarText = false

img1

2、isDarkStatusBarText = true

img2