前面学习的解决实现沉浸式状态栏的方法是AndroidManifest中的application的theme属性文件中设置
<item name="android:windowTranslucentStatus">true</item>
然后在每一个Activity的根布局中设置fitsSystemWindows属性为true,现在想想挺麻烦,时不时也会忘,今天在简书上看到一边文章点击打开链接
了解到沉浸式的意思其实是隐藏状态栏,也就是通常我们说的全屏,而透明化状态栏才是我们说的"沉浸式",那么要实现透明化状态栏必须是要设置
<item name="android:windowTranslucentStatus">true</item>这个的,当然你也可以在Activity的基类中设置,那么设置了这个属性就肯定要设置fitsSystemWindows属性为true,除了每个布局都定义之外,我们还可以把自定义的Activity基类给设置成abstract类型的,添加一个getLayoutId()方法,交给每个Activity去实现(因为所有的Activity都要继承这个基类),在Activity基类的onCreate方法中:
setContentView(getLayoutResId());//把设置布局文件的操作交给继承的子类
ViewGroup contentFrameLayout = (ViewGroup) findViewById(Window.ID_ANDROID_CONTENT);
View parentView = contentFrameLayout.getChildAt(0);
if (parentView != null && Build.VERSION.SDK_INT >= 14) {
parentView.setFitsSystemWindows(true);
}
添加上述代码。很显然,这和添加fitsSystemWindows没什么两样,每一个Activity都要去实现这个方法。
除此之外,我们就只有自己在状态栏的位置补上一块和状态栏同等高度的View了,这就相当于自己实现了fitsSystemWindows属性效果,这样倒是一劳永逸,不过状态栏颜色还是不能设置成和当前页面最上层一致的颜色,太死板。
//自己填充statusBar部分(无法做到每个Activity页最上层的颜色都和状态栏一致)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
ViewGroup firstChildAtDecorView = ((ViewGroup) ((ViewGroup) getWindow().getDecorView()).getChildAt(0));
View statusView = new View(this);
ViewGroup.LayoutParams statusViewLp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight());
//颜色的设置可抽取出来让子类实现之
statusView.setBackgroundColor(getResources().getColor(android.R.color.holo_blue_light));
firstChildAtDecorView.addView(statusView, 0, statusViewLp);
}
/**
* 获取状态栏高度
* @return
*/
private int getStatusBarHeight() {
int resId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resId > 0) {
return getResources().getDimensionPixelSize(resId);
}
return 0;
}
总之,实现透明化状态栏最好的方式还是添加fitsSystemWindows属性...