android6.0以下版本根据品牌系统适配
-
小米
具体可以查看小米开放平台的开发文档
if (Build.MANUFACTURER.equals("Xiaomi")) { Class<? extends Window> 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(), darkModeFlag, darkModeFlag); } catch (Exception e) { e.printStackTrace(); } } -
魅族
魅族系统貌似会自动根据界面的背景自己适配状态栏颜色
-
其他
可以去查看对应系统的开发文档
半透明状态栏
如果
UI妹子不是特别要求透明状态栏的话,可以使用该方式(图2效果)其实就是给布局的顶部加一个状态栏大小高度一样的半透明控件
//设置半透明状态栏
protected void setHalfStatusBar() {
//获取状态工具类
int statusBarHeight = StatusBarUtil.getStatusBarHeight(this);
if (statusBarHeight > 0) {
//给根布局加一个和状态栏一样大小高度半透明黑色的状态栏,并放置在顶部
ViewGroup content = (ViewGroup) findViewById(android.R.id.content);
View translucentStatusBarView = StatusBarUtil.createTranslucentStatusBarView(this, 56);
if (translucentStatusBarView != null) {
content.addView(translucentStatusBarView);
}
}
}
/**
* 获取状态栏高度
*
* @param context context
* @return 状态栏高度
*/
public static int getStatusBarHeight(Context context) {
// 获得状态栏高度
int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android");
int dimensionPixelSize = context.getResources().getDimensionPixelSize(resourceId);
if (dimensionPixelSize <= 0) { // 如果为获取不到 就使用xml文件的
dimensionPixelSize = context.getResources().getDimensionPixelSize(R.dimen.top_bar);
}
return dimensionPixelSize;
}
/**
* 创建半透明矩形 View
* 注意是LinearLayout.LayoutParams,因为默认添加到decorView
*
* @param alpha 透明值
* @return 半透明 View
*/
public static View createTranslucentStatusBarView(Activity activity, int alpha) {
// 绘制一个和状态栏一样高的矩形
View statusBarView = new View(activity);
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getStatusBarHeight(activity));
statusBarView.setLayoutParams(params);
statusBarView.setBackgroundColor(Color.argb(alpha, 0, 0, 0));
return statusBarView;
}
带来的问题
-
布局时会加上状态栏的高度
解决1:给布局或者第一个控件加上一个状态栏高度的
padding或margin解决2:
fitSystemWindows调整系统窗口布局以适应你自定义的布局 -
fitSystemWindows带来的输入法问题 当给布局加上该属性后,布局会自动添加一个padding让布局的内容在状态栏之下,但是会导致输入弹出遮挡控件或者设置了
fitSystemWindows属性的控件被拉伸。 大家可以参考网上的办法解决