Android狀態列--實現狀態列全透明
一、概述
最近專案中要求實現一個狀態列全透明的效果,先來兩張效果圖。
首頁效果圖:
其它介面效果圖:
如上面兩圖所示,一個Activity中的兩個Fragment的狀態列分別顯示不同的效果。
主要思路就是把狀態列變透明,把標題欄弄沒。
二、實現
實現方法有兩種,一種是在佈局中設定,另一種是在程式碼中設定。
Android4.4以下的系統無法對狀態列進行操作,所以本文針對Android4.4系統和Android5.0及以上系統進行說明。
對於Android4.4系統和Android5.0及以上系統,首先都要先在styles.xml中設定主題樣式,先去掉標題欄,要新增以下兩行程式碼:
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
我這裡直接在預設主題AppTheme中添加了:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark" >@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
</style>
對於Android4.4系統:
可以新建“values-v19/styles.xml”檔案,新增程式碼:
<style name ="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
也可以不設定android:windowTranslucentStatus屬性為true,改為在Activity中新增以下程式碼:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
對於Android5.0及以上系統:
可以新建“values-v21/style.xml”檔案,新增程式碼跟Android4.4系統一樣:
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="windowActionBar">false</item>
<item name="windowNoTitle">true</item>
<item name="android:windowTranslucentStatus">true</item>
</style>
但是這樣顯示出來的狀態列是半透明的,要想實現全透明,可以在Activity中進行設定,新增程式碼:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
window.setStatusBarColor(Color.TRANSPARENT);
window.getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN | View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
}
對於以上這些方法,不能在相關的佈局檔案中設定fitsSystemWindows為true,不然整個佈局會向下移動一個狀態列高度的距離,狀態列還是會顯灰白色呈現出來。
三、後記
剛開始寫部落格,有些不足希望不要在意,並且這篇文章也有很多可以補充的地方,今後有時間可能會補充上去。
在其它介面存在EditText時,點選EditText彈出虛擬鍵盤後回到首頁,又出現了狀態列顯灰白色的情況,如下圖所示:
解決辦法是在AndroidManifest.xml檔案中給對應的Activity設定windowSoftInputMode屬性值為adjustPan或者adjustNothing即可
後記(二)
Android6.0系統以上可以給狀態列文字顏色改成黑色,程式碼如下:
public static void setStatusBarMode(Activity activity, boolean bDark) {
//6.0以上
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
Window window = activity.getWindow();
View decorView = window.getDecorView();
if (decorView != null) {
int vis = decorView.getSystemUiVisibility();
if (bDark) {
vis |= View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
window.setStatusBarColor(activity.getResources().getColor(R.color.white));
} else {
vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR;
window.setStatusBarColor(activity.getResources()
.getColor(R.color.colorPrimaryDark));
}
decorView.setSystemUiVisibility(vis);
}
}
}
新增View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR屬性就能使狀態列文字顏色變黑,移除變回原樣