手上有一台古老的小米三,平常也没用,昨天拿出来运行下项目的时候发现状态栏是黑乎乎的。有强迫症的我就受不了了,于是就查了下4.4的Android兼容沉浸状态栏。
Android Studio兼容
在Github上有一个开源的系统栏管理器框架,叫Systembartint 首先,将其引用到项目当中: compile 'com.readystatesoftware.systembartint:systembartint:1.0.3' 再来看下官方Demo的使用方法。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_match_actionbar);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
setTranslucentStatus(true);
}
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintResource(R.color.statusbar_bg);
}
@TargetApi(19)
private void setTranslucentStatus(boolean on) {
Window win = getWindow();
WindowManager.LayoutParams winParams = win.getAttributes();
final int bits = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
if (on) {
winParams.flags |= bits;
} else {
winParams.flags &= ~bits;
}
win.setAttributes(winParams);
}
使用方法还是比较简单的,代码量不大。集成到工程的BaseActivity当中执行。 运行结果:
很明显的View往上移动了。 然后继续查看官方的sample源码。
然后在项目当中创建一个19api的styles 使用这个主题。然而。。。崩溃了。 然后修修改改 修修改改 后 改好了。。。 最后修改好的styles
在项目的res目录下 创建一个叫values-v19的文件夹,然后创建styles.xml文件夹把以下代码复制过去
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<!--兼容4.4API沉浸状态栏-->
<item name="android:windowTranslucentStatus">true</item>
<item name="android:fitsSystemWindows">true</item>
</style>
</resources>
最后上一下修改好后完整的BaseActivity BaseActivity代码 因为我当时创建项目的时候 默认的主题是Theme.AppCompat.Light.DarkActionBar 所以需要隐藏一下ActionBar
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//判断api是否是19和20 才进行适配 21以上的版本就不需要自己再去兼容了
if (Build.VERSION.SDK_INT == Build.VERSION_CODES.KITKAT || Build.VERSION.SDK_INT ==Build.VERSION_CODES.KITKAT_WATCH) {
setTranslucentStatus(true);
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintResource(R.color.colorPrimary);
} else {
getSupportActionBar().hide();//隐藏Action
}
}
最后 需要在res目录下再建立一个values-v21的文件夹 也放入一个style.xml文件,这个xml文件可以直接在values目录下把style复制过来,至于原因是因为,已经指定了19的api了,在运行程序的时候,系统发现有指定api的style的话,会去引入距当前系统api版本最近的一个style,当然,它是不会引用比当前系统更高api的style。所有如果不去指定21的style的话,那么它会引用api19的style,当然,也可以使用v19的style,但是这样的话,就得兼容>=19的API,在BaseActivity的onCreate中 修改if条件 改为:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//判断api大于或等于19
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT ) {
setTranslucentStatus(true);
SystemBarTintManager tintManager = new SystemBarTintManager(this);
tintManager.setStatusBarTintEnabled(true);
tintManager.setStatusBarTintResource(R.color.colorPrimary);
} else {
getSupportActionBar().hide();//隐藏Action
}
}
最后运行结果
Eclipse兼容
Eclipse的话 不需要集成依赖 直接调用setColor即可 起初有在android studio中使用 然而 崩溃了,但是在Eclipse上倒是正常。 这个方法记得好像是在一个csdn的博客上看到的,抱歉,不记得地址了
public static void setColor(Activity activity, int color) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
activity.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
View statusView = createStatusView(activity, color);
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
decorView.addView(statusView);
ViewGroup rootView = (ViewGroup) ((ViewGroup) activity.findViewById(android.R.id.content)).getChildAt(0);
rootView.setFitsSystemWindows(true);
rootView.setClipToPadding(true);
}
}
private static View createStatusView(Activity activity, int color) {
int resourceId = activity.getResources().getIdentifier("status_bar_height", "dimen", "android");
int statusBarHeight = activity.getResources().getDimensionPixelSize(resourceId);
View statusView = new View(activity);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
statusBarHeight);
statusView.setLayoutParams(params);
statusView.setBackgroundColor(color);
return statusView;
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于