1. 程式人生 > >Android狀態列--實現狀態列全透明

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屬性就能使狀態列文字顏色變黑,移除變回原樣