Android 沉浸式状态栏的苦逼之旅,先说一下基本设定
1、values-v21
2、values-v19
开发完程序用同事的小米手机测试(⊙o⊙),突然发现白色状态栏,白色字体(⊙﹏⊙)b,这TM的能看吗,于是就有了下面的代码
//处理状态栏,小米 public static void setStatusBarDarkMode(boolean darkmode, Activity activity) { Class clazz = activity.getWindow().getClass(); try { int darkModeFlag = 0; Class layoutParams = Class.forName("android.view.MiuiWindowManager$LayoutParams"); Field field = layoutParams.getField("EXTRA_FLAG_STATUS_BAR_DARK_MODE"); darkModeFlag = field.getInt(layoutParams); Method extraFlagField = clazz.getMethod("setExtraFlags", int.class, int.class); extraFlagField.invoke(activity.getWindow(), darkmode ? darkModeFlag : 0, darkModeFlag); } catch (Exception e) { e.printStackTrace(); } }
然后BaseActivity中的onCreate中setStatusBarDarkMode(true, this);一下,好了字体变黑了,既然字体可变了,那么就该改状态栏,先上一张图
这是Android5.0的效果图,所以我们经常看到刚创建的工程里面有这样的代码
恩,我们要修改statusBarColor,然而4.4-5.0没法直接改状态栏颜色,折中办法
1、状态栏变半透明,没错就是上面values-v19的设置
2、在状态栏上加一个布局
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { int color = COLOR_DEFAULT; ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); if (statusColor != INVALID_VAL) { color = statusColor; } View statusBarView = new View(activity); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); //可以是资源,我这是渐变的,像QQ一样 statusBarView.setBackgroundResource(R.drawable.bg_title_gradient); //可以是具体的颜色,反正View能设置的都想 //statusBarView.setBackgroundColor(color); contentView.addView(statusBarView, lp); }
获取状态栏的高度
public static int getStatusBarHeight(Context context) { int result = 0; int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); if (resourceId > 0) { result = context.getResources().getDimensionPixelSize(resourceId); } return result; }
以上就是4.4-5.0状态栏的设置方法
5.0以后的
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (statusColor != INVALID_VAL) { //透明状态栏,也就是不能要values-v19中主题的方法 activity.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); //需要设置这个 flag 才能调用 setStatusBarColor 来设置状态栏颜 activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); activity.getWindow().setStatusBarColor(statusColor); } }
好了,在BaseActivity里面onCreate使用,比如StatusBarCompat.compat(this, R.color.blue);
打开我自己的红米手机(不好意思用同事的),一脸闷逼之状态栏没变色,然后看一下系统版本5.0的,没问题啊,然后我将百度翻烂了没找到原因,而在另一台华为4.4上都是可以的。最后还是在写布局的时候忘加入android:fitsSystemWindows=”true”发现状态栏根本不是透明的,就是白的…
我不想用自己的手机测试了,就创建了个模拟器(Android7.0),什么,状态栏又没变色%>_<%,经过测试,状态栏是半透明的,其他软件状态栏是变色的,好吧我发大招了,我的终极代码
@TargetApi(Build.VERSION_CODES.LOLLIPOP) public static void compat(Activity activity, int statusColor) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { if (statusColor != INVALID_VAL) { int color = COLOR_DEFAULT; ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); if (statusColor != INVALID_VAL) { color = statusColor; } View statusBarView = new View(activity); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); statusBarView.setBackgroundResource(R.drawable.bg_title_gradient); contentView.addView(statusBarView, lp); } } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { int color = COLOR_DEFAULT; ViewGroup contentView = (ViewGroup) activity.findViewById(android.R.id.content); if (statusColor != INVALID_VAL) { color = statusColor; } View statusBarView = new View(activity); ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity)); statusBarView.setBackgroundResource(R.drawable.bg_title_gradient); contentView.addView(statusBarView, lp); } }
好吧上下一样,由于公司可测试手机不多(他们都用苹果),也没找到集体原因,以上方法应该可以应对4.4以上所有方法