在项目开发中,有的地方需要沉浸式的状态栏,而且会遇到底部TAB切换时,不同fragment中顶部状态栏颜色不一致的需求,这样一来,假设我们设置Afragment状态栏为白色,那么其中的文字图标将会看不见,所以经过整理和小方面的适配,将自己知道的贴出来给大家共享
话不多说,直接贴代码
1.首先我的项目里是要设置状态栏颜色的,所以先设置颜色
/*
* 修改状态栏颜色
* */
public void setWindowStatusBarColor(Activity activity, int colorResId,boolean dark) {
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = activity.getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(activity.getResources().getColor(colorResId));
//底部导航栏
//window.setNavigationBarColor(activity.getResources().getColor(colorResId));
}
setAndroidNativeLightStatusBar(activity,dark);
} catch (Exception e) {
e.printStackTrace();
}
}
注:其中boolean值是根据你设置的颜色来决定的,如果要设置状态栏颜色为白色,就为true,下面的代码中有描述
2.第二步,设置不同状态栏颜色下,文字和图标的颜色
/*
* 修改不同状态栏颜色中的文字及图标颜色
* */
private void setAndroidNativeLightStatusBar(Activity activity, boolean dark) {
View decor = activity.getWindow().getDecorView();
//dark 为状态栏白色时等于true
//增加下面两个flag时会将顶部状态栏与布局重叠到一起 android:fitsSystemWindows="true" 在布局根节点加入此行代码
if (dark) {
//设置状态栏分别为白色黑字、灰色白字、暗色白字
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//6.0以上可以通过直接设置SYSTEM_UI_FLAG_LIGHT_STATUS_BAR属性即可。
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(Color.GRAY); //21以上不支持6.0直接设置的方法,可用灰色代替,具体可自己设置
//getWindow().setStatusBarColor(Color.parseColor("#40000000"));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);//4.4版本本身就含有暗色阴影,不作其他处理即可
}
} else {
//设置状态栏文字颜色分别为默认白色,只是修改状态栏颜色
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//6.0以上可以通过直接设置SYSTEM_UI_FLAG_LAYOUT_STABLE属性即可。
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
getWindow().setStatusBarColor(getResources().getColor(R.color.colorPrimary)); //21以上不支持6.0直接设置的方法,具体可自己设置颜色
//getWindow().setStatusBarColor(Color.parseColor("#40000000"));
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN){
decor.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);//4.4版本本身就含有暗色阴影,不作其他处理即可
}
}
}
注:在设置状态栏全透明后,整个activity布局都会上移充满整个屏幕,如果你不想让布局上移的话就需要在根布局设置
android:fitsSystemWindows="true"
第一个 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 并拓展几个常用的flag
1.View.SYSTEM_UI_FLAG_VISIBLE :状态栏和Activity共存,Activity不全屏显示。也就是应用平常的显示画面
2.View.SYSTEM_UI_FLAG_FULLSCREEN :Activity全屏显示,且状态栏被覆盖掉
3.View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN :Activity全屏显示,但是状态栏不会被覆盖掉,而是正常显示,只是Activity顶端布 局会被覆盖住
4.View.INVISIBLE : Activity全屏显示,隐藏状态栏
我们用到的就是第三个,至于更深入的研究就交给你们了
第二个 SYSTEM_UI_FLAG_LIGHT_STATUS_BAR 官方在Android6.0中提供了亮色状态栏模式
第三个 SYSTEM_UI_FLAG_LAYOUT_STABLE 给出链接,你们自行观看吧我也有点解释不清楚
http://www.jcodecraeer.com/a/anzhuokaifa/developer/2014/1117/1997.html
虽然也是东拼西凑来的,可自己确实验证过,希望能帮到你们,搞个原创也还可以吧~~