當使用support裏的design 庫裏的BottomSheetDialog時,在6.0的機器上當對話框彈出時系統狀態欄會變黑,以下圖所示:
一開始覺得是我用的姿式不對,試過對style配置狀態欄顏色,配置其餘可能影響到的屬性都沒成功,今天google了一下,發現應該是BottomSheetDialog自己實現的問題,見:https://code.google.com/p/android/issues/detail?id=202691。其中的一條評論認爲應該是BottomSheetDialog使用的佈局爲MATCH_PARENT``MATCH_PARENT
致使,並經過修改佈局高度的方式解決了這個問題,見下面第一種解決方法:java
繼承BottomSheetDialog並重寫其protected void onCreate(Bundle savedInstanceState)
方法,代碼以下:android
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int screenHeight = getScreenHeight(getOwnerActivity());
int statusBarHeight = getStatusBarHeight(getContext());
int dialogHeight = screenHeight - statusBarHeight;
getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, dialogHeight == 0 ? ViewGroup.LayoutParams.MATCH_PARENT : dialogHeight);
}
private static int getScreenHeight(Activity activity) {
DisplayMetrics displaymetrics = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
return displaymetrics.heightPixels;
}
private static int getStatusBarHeight(Context context) {
int statusBarHeight = 0;
Resources res = context.getResources();
int resourceId = res.getIdentifier("status_bar_height", "dimen", "android");
if (resourceId > 0) {
statusBarHeight = res.getDimensionPixelSize(resourceId);
}
return statusBarHeight;
}
若是你和我同樣是使用了BottomSheetDialogFragment
的話,那麼須要繼承它並重寫它的public Dialog onCreateDialog(Bundle savedInstanceState)
方法,改成返回一個你重寫後的Dialog對象:程序員
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
return new YourBottomSheetDialog(getContext(), getTheme());
}
解決後的效果是這樣的:
markdown
解決了狀態欄變成黑色的問題,而且也沒帶來新的問題,能夠說是完美解決。ide
FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
標誌第二種解決方法是在返回對話框以前,對Window添加一個FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS
標誌位。它一樣是須要繼承BottomSheetDialogFragment
,並重寫如下方法:佈局
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
}
return dialog;
}
然而,在華爲帶虛擬導航欄的手機中運行起來會這樣:
ui
底部的內容被虛擬導航欄遮住了。這個方法不能採用。google
修改方法與第二種相似,代碼以下:spa
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Dialog dialog = super.onCreateDialog(savedInstanceState);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
}
return dialog;
}
結果以下:
code
它也沒什麼問題,不過對於可以設置狀態欄顏色的狀況下,我仍是不喜歡頂部這種半透明的漸變。
總結一下,第一種解決方法能夠說是徹底知足個人要求。第二種解決方法在一些設備上有缺陷。第三種方法代碼量一樣也是最小的,不過它是設置頂部狀態欄爲半透明,這一點與我程序員其餘地方在6.0系統上直接設置狀態欄顏色的行爲不一致,因此在項目中也不採用它。
《Show BottomSheetDialogFragment changes status bar color to black》