狀態欄透明方法:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
或
<item name="android:windowTranslucentStatus">true</item>
第一種方法是在代碼中設置,在setContentView()之前設置。
第二種方法在Activity的主題Theme文件中設置。
這兩種方法更多的用戶4.4版本的沉浸式狀態欄效果,其主要是將狀態欄的顏色設置爲透明,自動將當前窗口內的佈局整體上移一個statusbar的高度。所以,在4.4版本上做沉浸式,需要單獨增加一個狀態欄高度的view,用來佔位。但是這種思路的方案在6.0上也能夠實現。有兩種方案:
方案一
private void sinkStatusBar1() {
// 在4.4開始,通過設置windowTranslucentStatus來透明話狀態欄
// 或者在style中通過設置"android:windowTranslucentStatus"爲true來設置
// 但是,僅僅設置該屬性, 應用標題欄和狀態欄重疊了,相當於整個佈局上移了StatusBar的高度。
// 下屬方案是直接在content佈局部分頂部增加一個佔位組件,高度與statusbar高度相同
// 6.0上也可直接運行
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
ViewGroup rootView =
(ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
int count = rootView.getChildCount();
//判斷是否已經添加了statusBarView
if (count > 0 && rootView.getChildAt(0) instanceof FakeStatusBarView) {
rootView.getChildAt(0).setBackgroundColor(calculateStatusBarColor());
} else {
FakeStatusBarView statusBarView = createFakeStatusBar();
rootView.addView(statusBarView, 0);
}
// }
}
方案二
private void sinkStatusBar2() {
// 在4.4開始,通過設置windowTranslucentStatus來透明話狀態欄
// 或者在style中通過設置"android:windowTranslucentStatus"爲true來設置
// 但是,僅僅設置該屬性, 應用標題欄和狀態欄重疊了,相當於整個佈局上移了StatusBar的高度。
// 下述方案是直接在DecorView佈局部分最後增加一個佔位組件,高度與statusbar高度相同
// 6.0上也可直接運行
// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
//獲取windowphone下的decorView
ViewGroup decorView = (ViewGroup) getWindow().getDecorView();
int count = decorView.getChildCount();
//判斷是否已經添加了statusBarView
if (count > 0 && decorView.getChildAt(count - 1) instanceof FakeStatusBarView) {
decorView.getChildAt(count - 1).setBackgroundColor(calculateStatusBarColor());
} else {
//新建一個和狀態欄高寬的view
FakeStatusBarView statusView = createFakeStatusBar();
decorView.addView(statusView);
}
ViewGroup rootView = (ViewGroup) ((ViewGroup) findViewById(android.R.id.content)).getChildAt(0);
//rootview不會爲狀態欄留出狀態欄空間
ViewCompat.setFitsSystemWindows(rootView,true);
rootView.setClipToPadding(true);
// }
}
兩種方案的區別,一個是在DecorView節點下增加一個佔位View。而方案一是直接在DecorView的content佈局節點內增加一個佔位View。