最近要单独做一个公司内部使用的APP,由于功能点不多,老大让我自己一个人搞定,这对于刚入坑(转行Android)不到四个月的我来说既是挑战,也是机遇,因为从架构设计、框架的搭建到具体功能的实现都得自己一个人来完成,这对我是一个很好的锻炼。
今天来总结一下Android沉浸式状态栏的实现,现在越来越多的APP都做成了沉浸式,以前低版本的安卓系统上格格不入的黑色的状态栏现在已经不多见,目前我们市面上的手机安卓版本大都在4.4以上了,所以几乎都可以支持沉浸式状态栏,但是目前APP大都还在兼容4.0以上,也有还在兼容2.3和2.2的,其实个人觉得没有太大的必要了,毕竟2.+已经是5年前的版本,很少有手机有那么长的生命周期。这这以前看了很多关于解决这个问题的博客,解决方法很多都是分4.4版本到5.0版本和5.1一级以上两个版本做不同的处理,4.4到5.0都是先将状态栏设置为透明,在创建一个有颜色的状态栏填充,5.1以后安卓可以有设置状态栏的方法
activity.getWindow().setStatusBarColor(activity.getResources().getColor(R.color.app_blue));
但是我测试了一下,有些手机可能由于厂商定制的原因并不起作用,我在小米手机(米三到米5)测试没问题,华为手机如果是5.1的就不行,现在我们统一只管4.4以上版本(沉浸式只有4.4以上支持):
package com.meskal.utils;
import android.app.Activity;
import android.os.Build;
import android.view.View;
import android.view.ViewGroup;
import android.view.Window;
import android.view.WindowManager;
public class StatusBarUtils {
/**
* 设置status 颜色
*/
public static void setStatusBarColor(Activity activity, int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
View view = createStatusBarView(activity, color);
if (view != null) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup viewGroup = (ViewGroup) activity.getWindow().getDecorView();
viewGroup.addView(view);
View contentView = ((ViewGroup) activity.getWindow().getDecorView()
.findViewById(Window.ID_ANDROID_CONTENT)).getChildAt(0);
if(contentView instanceof ViewGroup){
ViewGroup content = (ViewGroup)contentView;
//这个是为了内容不会伸到zh
content.setFitsSystemWindows(true);
content.setClipToPadding(true);
}
}
}
}
/**
* 获取系统状态栏的高度
* @param activity
* @return
*/
private static int getStatusBarHeight(Activity activity) {
int viewHeight = 0;
if (activity != null) {
int resourseId =
activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
viewHeight = activity.getResources().getDimensionPixelSize(resourseId);
}
return viewHeight;
}
/**
* 创建一个view填充状态栏
*/
private static View createStatusBarView(Activity activity, int color) {
int viewHeight = getStatusBarHeight(activity);
if (viewHeight == 0) {
return null;
} else {
View view = new View(activity);
ViewGroup.LayoutParams layoutParams =
new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, viewHeight);
view.setLayoutParams(layoutParams);
view.setBackgroundColor(color);
return view;
}
}
}
最后上一张效果图(截自开始测试不成功的华为手机5.1系统):
看到这个图在吐槽一下华为手机,不仅是状态栏,还有那可恶的虚拟键,适配真是恶心!