问题描述

当使用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时状态栏变黑的问题的更多相关文章

  1. Unity程序协同问题,传送时屏幕变黑变亮的解决,常规操作的行为集合

    在unity中运行某段程序时往往需要运行另外一段不相干但是却对功能上有需求的程序,比如进行场景传送,在传送点处,点击I键,屏幕慢慢变黑,场景传送到另外一个场景,场景又慢慢变亮.这里首先涉及两个物体,一 ...

  2. 解决iphone横屏时字体变大问题或者内容大小不一样等

    在样式表中增加: @media screen and (max-device-width: 320px){body{-webkit-text-size-adjust:none}} @media scr ...

  3. iphone上做webapp时总会识别一串数字为手机号码并变黑显示

    iphone上网页里总会识别一串数字为手机号码并变黑显示 只需要在head里加上一个特别的meta即可 <meta name="format-detection" conte ...

  4. proBuilder编辑的模型变黑

    ----更正: 旧帖中方法有误,解决不了问题. 更正确法: 将proBuilder创建的模型的Static属性由“-”改为去掉勾选:   ----旧帖 proBuilder编辑的模型变黑解法: 1,U ...

  5. NGUI 实现 透明底图遮罩 && 人物像素变黑

    今天 UI 那边要求实现一个 透明底图遮罩 与 变黑 的效果. 刚开始考虑使用 shader 实现一个 网上搜了一下,发现了这个,但是底图需要不透明才行,不然他会把 底图的不遮罩部分的透明部分 进行颜 ...

  6. 黑色背景下 vs把{}括号变黑问题

    最近喜欢把VS的背景搞成黑色,据说这样可以对眼睛好一点,然后就蛋疼的碰到点击括号中的内容,括号就变黑的问题,这样黑色背景下就什么看不到了. 原因是装了番茄助手导致的,解决办法,把选中行VA Brace ...

  7. 解决like '%字符串%'时索引不被使用的方法

    解决like '%字符串%'时索引不被使用的方法   分步阅读 解决like '%字符串%'时索引不被使用的方法,如果like以通配符开头('%abc')时索引会失效会变成全表扫描的操作. 工具/原料 ...

  8. iOS 解决LaunchScreen中图片加载黑屏问题

    iOS 解决LaunchScreen中图片加载黑屏问题 原文: http://blog.csdn.net/chengkaizone/article/details/50478045 iOS 解决Lau ...

  9. 解决Gradle编译时出现: 编码GBK的不可映射字符

    解决Gradle编译时出现: 编码GBK的不可映射字符 在build.gradle文件中加入如下内容: [compileJava, compileTestJava]*.options*.encodin ...

随机推荐

  1. [Kaggle] dogs-vs-cats之制作数据集[1]

    Step 0:导入必要的库 import tensorflow as tfimport os Step 1:获取图片文件名以及对应的标签 首先是读取给定路径下所有图片的名称以及对应的标签.os.lis ...

  2. [转]map函数补充

    map()函数 map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回. 例如,对于li ...

  3. Flume报 Space for commit to queue couldn't be acquired. Sinks are likely not keeping up with sources, or the buffer size is too tight

    报这个错误 需要一个是flume堆内存不够.还有一个就是把channel的容器调大 在channel加配置 type - 组件类型名称必须是memory capacity 100 存储在 Channe ...

  4. ABP公共结构

    1.ABP依赖注入 维基百科说:“依赖注入是一种软件设计模式,指一个或多个依赖(或服务)被注入,或通过引用传递,传入一个依赖对象(或客户端)并成为客户状态的一部分.模式通过自身的行为分离了客户依赖的创 ...

  5. C#之PixturBox控件实现缩放和拖动图片

    一.实现鼠标滚轮控制图片缩放: 1.设置PixtureBox属性: Dock:none SizeMode:StretchImage 2.添加事件: pbxDrawing.MouseWheel += n ...

  6. p2p项目总结

    1.关于ajax请求所要注意的地方:$.psot(url,json,callback,type) (1)url路径问题,在html中写绝对路径不能用EL表达式,EL表达式只能在jsp中使用 (2)js ...

  7. pyqt5 动画学习(四) 旋转动画,使用QGraphicsView让自己的控件旋转起来

    今天学有所成,赶紧记下今天的成果 之前三篇文章分别演示了空间的大小改变,移动,及颜色变化.在后续研究旋转的过程中即为艰难 如果你是使用pyqt4,那么使用QGraphicsItemAnimation便 ...

  8. 基于webpack的React项目搭建(一)

    前言 工欲善其事,必先利其器.为了更好的学习React,我们先简要的把开发环境搭建起来.本文主要介绍使用webpack搭建React项目,如果你对React或es6的基础语法还不了解,建议先去学习学习 ...

  9. [JSOI2008]球形空间产生器

    Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球 面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧 ...

  10. tcp窗口滑动以及拥塞控制(转)

    转自:http://blog.chinaunix.net/uid-26275986-id-4109679.html TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥 ...