手上有一臺(tái)古老的小米三,平常也沒(méi)用,昨天拿出來(lái)運(yùn)行下項(xiàng)目的時(shí)候發(fā)現(xiàn)狀態(tài)欄是黑乎乎的。有強(qiáng)迫癥的我就受不了了居砖,于是就查了下4.4的Android兼容沉浸狀態(tài)欄。
Android Studio兼容##
在Github上有一個(gè)開(kāi)源的系統(tǒng)欄管理器框架驴娃,叫<a >Systembartint</a>
首先奏候,將其引用到項(xiàng)目當(dāng)中: compile 'com.readystatesoftware.systembartint:systembartint:1.0.3'
再來(lái)看下官方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);
}
使用方法還是比較簡(jiǎn)單的唇敞,代碼量不大蔗草。集成到工程的BaseActivity當(dāng)中執(zhí)行。
運(yùn)行結(jié)果:
很明顯的View往上移動(dòng)了疆柔。
然后繼續(xù)查看官方的sample源碼咒精。
然后在項(xiàng)目當(dāng)中創(chuàng)建一個(gè)19api的styles 使用這個(gè)主題。然而旷档。模叙。。崩潰了鞋屈。
然后修修改改 修修改改 后 改好了范咨。。厂庇。 最后修改好的styles
在項(xiàng)目的res目錄下 創(chuàng)建一個(gè)叫values-v19的文件夾渠啊,然后創(chuàng)建styles.xml文件夾把以下代碼復(fù)制過(guò)去
<?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沉浸狀態(tài)欄-->
<item name="android:windowTranslucentStatus">true</item>
<item name="android:fitsSystemWindows">true</item>
</style>
</resources>
最后上一下修改好后完整的BaseActivity
BaseActivity代碼 因?yàn)槲耶?dāng)時(shí)創(chuàng)建項(xiàng)目的時(shí)候 默認(rèn)的主題是Theme.AppCompat.Light.DarkActionBar 所以需要隱藏一下ActionBar
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//判斷api是否是19和20 才進(jìn)行適配 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目錄下再建立一個(gè)values-v21的文件夾 也放入一個(gè)style.xml文件,這個(gè)xml文件可以直接在values目錄下把style復(fù)制過(guò)來(lái)权旷,至于原因是因?yàn)樘骝龋呀?jīng)指定了19的api了,在運(yùn)行程序的時(shí)候,系統(tǒng)發(fā)現(xiàn)有指定api的style的話躲查,會(huì)去引入距當(dāng)前系統(tǒng)api版本最近的一個(gè)style它浅,當(dāng)然,它是不會(huì)引用比當(dāng)前系統(tǒng)更高api的style熙含。所有如果不去指定21的style的話罚缕,那么它會(huì)引用api19的style艇纺,當(dāng)然怎静,也可以使用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
}
}
最后運(yùn)行結(jié)果
Eclipse兼容
Eclipse的話 不需要集成依賴 直接調(diào)用setColor即可 起初有在android studio中使用 然而 崩潰了,但是在Eclipse上倒是正常盟劫。
這個(gè)方法記得好像是在一個(gè)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;
}