Android使用沉浸式狀態(tài)欄會(huì)讓你的app看起來(lái)更加高大上司光,但是會(huì)產(chǎn)生很多兼容問(wèn)題此衅,一個(gè)app的activity肯定不止一個(gè)强戴,有的時(shí)候,需要漸變的toolbar挡鞍,有的時(shí)候骑歹,有需要DrawerLayout等布局,那沉浸式布局又會(huì)給你帶來(lái)許多麻煩
下面是我認(rèn)為沉浸式布局最好的定制方案了墨微,因?yàn)閍pp的每個(gè)activity都要實(shí)現(xiàn)沉浸式道媚,所以我建議你可以寫個(gè)BaseActivity讓所有的activity繼承他,這樣我們可以在里面做很多activity共同的事翘县,首先是xml文件的代碼:
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp"
android:background="@null"
app:theme="@style/toolbar_dark_theme">
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:background="@mipmap/toolbar_detail"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
app:titleTextColor="@color/colorAccent" />
<View android:id="@+id/bar_top"
android:layout_width="match_parent"
android:layout_height="0dp"
android:visibility="gone"
android:background="#20000000"></View>
</FrameLayout>
</android.support.design.widget.AppBarLayout>
跟大家常見(jiàn)的布局并沒(méi)有什么不同
就是在toolbar的外面套了一個(gè)FrameLayout布局最域,并添加了一個(gè)View(這個(gè)view就是狀態(tài)欄的底色)
因?yàn)橛袝r(shí)候,你的toolbar可能是白色的锈麸,你的狀態(tài)欄上面的圖標(biāo)字體可能也是白色的镀脂,會(huì)看不見(jiàn),你可設(shè)置#20000000半透明的灰色,比較接近google默認(rèn)的底色
至于AppBarLayout 的 app:theme="@style/toolbar_dark_theme 則是自定義的them,在style文件中加入
<!--toolbar 的樣式 start-->
<style name="toolbar_dark_theme" parent="ThemeOverlay.AppCompat.Light">
<item name="colorButtonNormal">@android:color/white</item>
<!--toolbar 圖標(biāo)的顏色掐隐,包括返回鍵狗热,菜單的點(diǎn)-->
<item name="colorControlNormal">@android:color/holo_red_light</item>
<!--toolbar 側(cè)滑菜單的顏色-->
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item>
<!--toolbar 菜單顯示的文字顏色-->
<item name="actionMenuTextColor">@android:color/holo_green_dark</item>
<item name="android:textColor">@android:color/holo_red_light</item>
<item name="android:textSize">13sp</item> <!-- 菜單文字字體大小-->
<!--三個(gè)點(diǎn)展開內(nèi)容的設(shè)置-->
<item name="actionOverflowMenuStyle">@style/OverflowMenuStyle</item>
<!--三個(gè)點(diǎn) 圖標(biāo)片的替換-->
<item name="android:actionOverflowButtonStyle">@style/ToolbarOverflow</item>
</style>
<style name="ToolbarOverflow" parent="@android:style/Widget.ActionButton.Overflow">
<item name="android:src">@drawable/ic_menu</item>
</style>
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle">
<item name="spinBars">true</item>
<item name="color">@android:color/holo_green_dark</item>
</style>
<style name="OverflowMenuStyle" parent="@style/Widget.AppCompat.PopupMenu.Overflow">
<!-- 是否覆蓋錨點(diǎn),默認(rèn)為true虑省,即蓋住Toolbar -->
<item name="overlapAnchor">false</item>
<!-- 彈出層背景顏色 -->
<item name="android:popupBackground">@android:color/holo_green_dark</item>
<!-- 彈出層垂直方向上的偏移匿刮,即在豎直方向上距離Toolbar的距離,值為負(fù)則會(huì)蓋住Toolbar -->
<item name="android:dropDownVerticalOffset">5dp</item>
<!-- 彈出層水平方向上的偏移探颈,即距離屏幕左邊的距離熟丸,負(fù)值會(huì)導(dǎo)致右邊出現(xiàn)空隙 -->
<item name="android:dropDownHorizontalOffset">-1dp</item>
</style>
<!--toolbar 的樣式 end-->
接下來(lái)就是在activity的應(yīng)用了:
/**
* 設(shè)置toolbar沉浸到任務(wù)欄
* @param toolbar
* 設(shè)置狀態(tài)欄的底色
* @param top_color
*/
public void SetToolbar(Toolbar toolbar,int top_color){
setSupportActionBar(toolbar);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
Window window = getWindow();
window.clearFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(ContextCompat.getColor(this,top_color));
window.setNavigationBarColor(Color.BLACK);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (Build.VERSION_CODES.LOLLIPOP>Build.VERSION.SDK_INT) {
View paddingView = findViewById(R.id.bar_top);
paddingView.setVisibility(View.VISIBLE);
ViewGroup.LayoutParams params = paddingView.getLayoutParams();
params.height = getStatusBarHeight();
}
toolbar.setFitsSystemWindows(true);
toolbar.getLayoutParams().height = getAppBarHeight();
toolbar.setPadding(toolbar.getPaddingLeft(),
getStatusBarHeight(),
toolbar.getPaddingRight(),
toolbar.getPaddingBottom());
}
}
private int getAppBarHeight() {
return dip2px(56) + getStatusBarHeight();
}
private int getStatusBarHeight() {
int result = 0;
int resourceId = getResources().getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
result = getResources().getDimensionPixelSize(resourceId);
}
return result;
}
private int dip2px(float dipValue) {
final float scale = getResources().getDisplayMetrics().density;
return (int) (dipValue * scale + 0.5f);
}
解釋一下上面代碼的意義
根據(jù)不同的系統(tǒng)版本,我們可以做的處理也是不一樣的伪节,Android 4.4 - Android 5.0 的Android 版本中并沒(méi)有以下方法光羞,所以沒(méi)辦法設(shè)置狀態(tài)欄和低欄的底色
window.setStatusBarColor(ContextCompat.getColor(this,top_color));
window.setNavigationBarColor(ContextCompat.getColor(this,navigation_color));
但是我們可以自定義布局以及顏色:
1.先設(shè)置充滿狀態(tài)欄
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
Window window = getWindow();
window.setFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS,
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
2.自定義一個(gè)狀態(tài)欄的布局绩鸣,并設(shè)置他的底色:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (Build.VERSION_CODES.LOLLIPOP>Build.VERSION.SDK_INT) {
View paddingView = findViewById(R.id.bar_top);
paddingView.setVisibility(View.VISIBLE);
ViewGroup.LayoutParams params = paddingView.getLayoutParams();
params.height = getStatusBarHeight();
}
toolbar.setFitsSystemWindows(true);
toolbar.getLayoutParams().height = getAppBarHeight();
toolbar.setPadding(toolbar.getPaddingLeft(),
getStatusBarHeight(),
toolbar.getPaddingRight(),
toolbar.getPaddingBottom());
}
3.補(bǔ)充一點(diǎn),如果你發(fā)現(xiàn)狀態(tài)欄的顏色依舊是原來(lái)的顏色纱兑,那就是說(shuō)你在布局文件中設(shè)置了呀闻,刪除就可以了
android:fitsSystemWindows="true"
至于5.0以上的沉浸式,Window類已經(jīng)可以設(shè)置了潜慎,只要代碼中加入以下代碼就可以:
Window window = getWindow();
window.clearFlags(
WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS
| WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
window.getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_LAYOUT_STABLE);
window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
window.setStatusBarColor(ContextCompat.getColor(this,top_color));
window.setNavigationBarColor(Color.BLACK);