解决使用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》相关文章推荐
- 解决使用BottomSheetDialog时状态栏变黑的问题
- 解决使用BottomSheetDialog时状态栏变黑的问题
- 解决使用BottomSheetDialog时状态栏变黑的问题
- Android BottomSheetDialog透明问题的解决办法
- 待解决问题:验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate
- IE6下使用jquery.bgiframe.js插件解决下拉框覆盖浮动层、Dialog的问题
- 解决使用NPOI在已有Sheet中插入多张图片问题
- BottomSheetDialog的使用
- 【原创】[Ext.ux.UploadDialog] 控件使用说明及在Ext 3.x下问题解决
- Android 自定义布局dialog使用(解决edittext无法弹出输入法的问题)
- Ext.ux.UploadDialog 控件使用说明及在Ext 3.x下问题解决
- 解决JSP页面无法使用EasyUI里面class="easyui-dialog"的问题
- 在bootstrap modal dialog中使用webupload,打不开对话框问题解决
- vs2005中 该项不适于在指定状态下使用 问题的解决
- 解决使用NPOI在已有Sheet中插入多张图片问题
- 1git命令的使用,查看git仓库状态,添加文件到git跟踪,git提交,查看git分支,查看git仓库日志信息,切换git分支,解决git分支合并后出现冲突的问题
- 1git命令的使用,查看git仓库状态,添加文件到git跟踪,git提交,查看git分支,查看git仓库日志信息,切换git分支,解决git分支合并后出现冲突的问题
- BottomSheetDialog高度不足够显示全部内容的解决办法
- Android使用的webcview中带有音乐播放控件,在关闭或分享时处于界面不可见状态下,声音仍在播放的问题解决
- 使用软引用解决Handler内存泄露和显示Popupwindow、Dialog时提示"Unable to add Window-token is null"的问题