沉浸式狀態欄確切的說應該叫做透明狀態欄。一般情況下,狀態欄的底色都為黑色,而沉浸式狀態欄則是把狀態欄設置為透明或者半透明。
為什么要使用沉浸式狀態欄
沉浸式狀態欄是從android Kitkat(Android 4.4)開始出現的,它可以被設置成與APP頂部相同的顏色,這就使得切換APP時,整個界面就好似切換到了與APP相同的風格樣式一樣。在內容展示上會顯得更加美觀。
實現方式
需要注意的是,因為沉浸式狀態欄是在Android4.4的時候出現的,所以只有4.4及以后的版本才能使用。實現沉浸式狀態欄的方式有幾種,最簡單的方式就是使用系統提供的方式進行實現。
系統提供的方法
- 在需要實現沉浸式狀態欄的Activity的布局中添加以下參數
android:fitsSystemWindows="true"
android:clipToPadding="true"
- 代碼中對當前系統進行判斷,符合要求(即系統是4.4或以上的版本)則設置成透明狀態欄
private void initState() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//透明狀態欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明導航欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
}
}
- 在Activity的setContentView()方法后面調用第二步驟的方法即可。
我在使用小米手機測試這個方法的時候出現了兩種情況
- 當我沒有在布局中設置clipToPadding為true的時候,會對應用的頂部Toolbar進行拉伸;
- 當我在布局中兩個參數都進行設置后,頂部狀態欄變成了白色。
因此,我使用了第二種方法:添加隱藏布局,動態調整布局高度適應狀態欄
動態適應狀態欄高度設置布局
因為第一部會出現的拉伸問題,所以我在Toolbar上方添加了一個隱藏LinearLayout,動態設置與狀態欄等高,抵消Toolbar拉伸。
- 在xml布局的頂部添加一個隱藏布局
<LinearLayout
android:id="@+id/ll"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:orientation="vertical"
android:background="#e7abff"<!--顏色被我設置成了與Toolbar一樣-->
android:visibility="gone">
</LinearLayout>
- 代碼中判斷系統版本,並通過反射設置隱藏布局高度
/**
* 動態的設置狀態欄 實現沉浸式狀態欄
*/
private void initState() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
//透明狀態欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//透明導航欄
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
LinearLayout linear_bar = (LinearLayout) findViewById(R.id.ll_bar);
linear_bar.setVisibility(View.VISIBLE);
//獲取到狀態欄的高度
int statusHeight = getStatusBarHeight();
//動態的設置隱藏布局的高度
LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) linear_bar.getLayoutParams();
params.height = statusHeight;
linear_bar.setLayoutParams(params);
}
}
/**
* 通過反射的方式獲取狀態欄高度
* @return
*/
private int getStatusBarHeight() {
try {
Class<?> c = Class.forName("com.android.internal.R$dimen");
Object obj = c.newInstance();
Field field = c.getField("status_bar_height");
int x = Integer.parseInt(field.get(obj).toString());
return getResources().getDimensionPixelSize(x);
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
- 上述步驟完成后同樣也是在Activity中的setContentView()后進行調用即可。
使用第三方庫進行實現
在github上也有開源的庫提供使用,如:SystemBarTint
不得不說開源的力量是如此的強大。使用方法在連接里有介紹,這里就不復述了。
更多文章也可關注我的靜態博客,更新相對會優先些傳送門