问题描述

当使用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. 框架学习笔记之Hibernate

    一.什么是Hibernate Hibernate框架是当今主流的持久层框架之一,该框架是基于JDBC的主流持久化框架,使用它之后能够大大简化程序DAO层的代码量,提高工作效率,因此受广大开发人员的喜爱 ...

  2. [翻译] TensorFlow Programmer's Guide之Frequently Asked Questions(问得频率最多的几个问题)

    目录: 特点和兼容性(Features and Compatibility) 建立一个TensorFlow图(Building a TensorFlow graph) 运行一个TensorFlow计算 ...

  3. 【转】cookielib模块

    cookielib模块 cookielib模块的主要作用是提供可存储cookie的对象,以便于与urllib2模块配合使用来访问Internet资源.例如可以利用本模块 的CookieJar类的对象来 ...

  4. vue-cli 的项目 切换到Linux环境下遇到问题

    之前用vue-cli脚手架在windows上开发的一个项目,现在有换mac的打算,但是换系统的话对代码对环境依赖比较严重. 去年和别的FE并行开发两个人用的都是windows,这样还好,没有什么问题, ...

  5. typeof与instanceof的区别

    一.instanceof运算符:       此运算符可以判断一个变量是否是某个对象(类)的实例,返回值是布尔类型的.想要理解它的作用,必须对面向对象有所理解: 代码实例如下: var str=new ...

  6. springCloud 微服务框架搭建入门(很简单的一个案例不喜勿扰)

    Spring cloud 实现服务注册及发现 服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. clou ...

  7. 深入探究Lua的GC算法(下)-《Lua设计与实现》

    紧接着上一篇文章zblade:深入探究Lua的GC算法(上)-<Lua设计与实现> 这篇文章让我们收尾GC的具体后续操作.转载请标明出处:http://www.cnblogs.com/zb ...

  8. SQL Server 2008 R2 安装注意事项

    上个星期自己第一次安装SQL Server 2008 R2,安装失败几次,结果用了将近1天的时间安装,最后成功了. 心得:1.安装SQL Server 2008 R2时,最好在第一次就安装成功.在百度 ...

  9. 远程连接服务器jupyter notebook、浏览器以及深度学习可视化方法

    h1 { counter-reset: h2counter; } h2 { counter-reset: h3counter; } h3 { counter-reset: h4counter; } h ...

  10. PHPCMS V9 任意文件下载(Windows)

    先来看看PHPCMS V9.6.0的任意下载 还是和上次的注入一样,是个由parse_str() 函数引发的变量覆盖. 位于 /phpv9.6.0/phpcms/modules/content/dow ...