本文将带你了解Android应用开发Android 沉浸式状态栏,希望本文对大家学Android有所帮助。
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
{
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以上所有方法
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!