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,不然内容就顶到状态栏里去了