您的位置:首页 > 其它

解决使用BottomSheetDialog时状态栏变黑的问题

2016-08-23 10:24 489 查看

问题描述

当使用support里的design 库里的BottomSheetDialog时,在6.0的机器上当对话框弹出时系统状态栏会变黑,如下图所示:



一开始以为是我用的姿势不对,试过对style配置状态栏颜色,配置其他可能影响到的属性都没成功,今天google了一下,发现应该是BottomSheetDialog本身实现的问题,见:https://code.google.com/p/android/issues/detail?id=202691。其中的一条评论认为应该是BottomSheetDialog使用的布局为
MATCH_PARENT``MATCH_PARENT
导致,并通过修改布局高度的方式解决了这个问题,见下面第一种解决方法:

解决方法

第一种,修改布局高度

继承BottomSheetDialog并重写其
protected void onCreate(Bundle savedInstanceState)
方法,代码如下:

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());
}


解决后的效果是这样的:



解决了状态栏变成黑色的问题,并且也没带来新的问题,可以说是完美解决。

第二种,添加
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;
}


然而,在华为带虚拟导航栏的手机中运行起来会这样:



底部的内容被虚拟导航栏遮住了。这个方法不能采用。

第三种,设置半透明状态栏

修改方法与第二种类似,代码如下:

@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;
}


结果如下:



它也没什么问题,不过对于能够设置状态栏颜色的情况下,我还是不喜欢顶部这种半透明的渐变。

总结

总结一下,第一种解决方法可以说是完全满足我的要求。第二种解决方法在一些设备上有缺陷。第三种方法代码量同样也是最小的,不过它是设置顶部状态栏为半透明,这一点与我程序员其他地方在6.0系统上直接设置状态栏颜色的行为不一致,所以在项目中也不采用它。

参考资料:

《Show BottomSheetDialogFragment changes status bar color to black》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐