沉浸式狀態(tài)欄的實(shí)現(xiàn)方式有兩種
第一種方法:代碼中設(shè)置
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATU;
int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATIO;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
//5.x開始需要把顏色設(shè)置透明却紧,否則導(dǎo)航欄會呈現(xiàn)系統(tǒng)默認(rèn)的淺灰色
Window window = activity.getWindow();
View decorView = window.getDecorView();
//兩個(gè) flag 要結(jié)合使用躯砰,表示讓應(yīng)用的主體內(nèi)容占用系統(tǒng)狀態(tài)欄的空間
int option = View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE;
decorView.setSystemUiVisibility(option);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(Color.TRANSPARENT);
//導(dǎo)航欄顏色也可以正常設(shè)置
// window.setNavigationBarColor(Color.TRANSPARENT);
} else {
Window window = activity.getWindow();
WindowManager.LayoutParams attributes = window.getAttributes();
int flagTranslucentStatus = WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS;
int flagTranslucentNavigation = WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION;
attributes.flags |= flagTranslucentStatus;
// attributes.flags |= flagTranslucentNavigation;
window.setAttributes(attributes);
}
ViewGroup contentFrameLayout = (ViewGroup)findViewById(android.R.id.content);
View parentView = contentFrameLayout.getChildAt(0);
parentView.setFitsSystemWindows(value);
}
第二種方法:通過設(shè)置 Theme 主題設(shè)置狀態(tài)欄透明
API21 之后(也就是 android 5.0 之后)的狀態(tài)欄弃锐,會默認(rèn)覆蓋一層半透明遮罩塔逃。且為了保持4.4以前系統(tǒng)正常使用掩缓,故需要三份 style 文件传泊,即默認(rèn)的values(不設(shè)置狀態(tài)欄透明)鼠渺、values-v19、values-v21(解決半透明遮罩問題)。
//valuse
<style name="TranslucentTheme" parent="AppTheme">
</style>
// values-v19。v19 開始有 android:windowTranslucentStatus 這個(gè)屬性
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
// values-v21草姻。5.0 以上提供了 setStatusBarColor() 方法設(shè)置狀態(tài)欄顏色。
<style name="TranslucentTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowTranslucentStatus">false</item>
<item name="android:windowTranslucentNavigation">true</item>
<!--Android 5.x開始需要把顏色設(shè)置透明普舆,否則導(dǎo)航欄會呈現(xiàn)系統(tǒng)默認(rèn)的淺灰色-->
<item name="android:statusBarColor">@android:color/transparent</item>
</style>
這種實(shí)現(xiàn)方式,底部導(dǎo)航欄的虛擬按鍵覆蓋住了布局校读;
從 style 中的屬性我們猜測沼侣,我們需要將 <item name="android:windowTranslucentNavigation">false</item>
屬性設(shè)置為 false ,是 Navigation Bar 不透明地熄,但效果卻并沒有變成我們想象的那樣华临,Status Bar 的樣式完全失效。
事實(shí)上端考,android:windowTranslucentNavigation
這個(gè)屬性額外設(shè)置了 SYSTEM_UI_FLAG_LAYOUT_STABLE
和 SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
兩個(gè) flag雅潭。所以我們需要再繪制完 Status Bar 以后重新請求這兩個(gè) flag 。
在 onCrate 方法中調(diào)用
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);