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

简介: 注:发现新版本的design库已经没有这个问题,使用以下代码可能会使底部增加一条灰色的条,请注意。问题描述当使用support里的design 库里的BottomSheetDialog时,在6.0的机器上当对话框弹出时系统状态栏会变黑,如下图所示: 一开始以为是我用的姿势不对,试过对style配置状态栏颜色,配置其他可能影响到的属性都没成功,今天google了一下,发现应该是BottomSheetDialog本身实现的问题,见:https://code.google.com/p/android/issues/detail?id=202691。

注:发现新版本的design库已经没有这个问题,使用以下代码可能会使底部增加一条灰色的条,请注意。

问题描述

当使用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》

目录
相关文章
任务栏自动隐藏和鼠标划过显示
操作如下:任务栏---右键----属性---自动隐藏任务栏打勾。当鼠标划过屏幕下方时就会出面任务栏,没经过时就隐藏了。
845 0
|
Java Android开发
listview 拖动黑色
引用:http://www.cnblogs.com/shunyao8210/archive/2011/07/06/2099344.html 在为程序加背景时,发现在拖动List或Grid列表时一片漆黑,很是难看 android提供了一种方法,在用户拖动列表时不总是一片漆黑或者说透明。
673 0
触屏事件-上下左右滑动
window.touchMove=function(){ // 用于纪录触摸开始时的坐标 var startX=0,startY=0, //创建一个变量,用于保存触摸方向 touchDirection=""; //创建一个对象,用于保存滑动事件 var funcs = {}; if(arguments.
1334 0
|
前端开发 JavaScript
按钮点击效果(水波纹)
近来看到个不错的按钮点击效果,当点击时产生一次水波涟漪效果,挺好玩的,于是简单的实现了下(没考虑低版本浏览器兼容问题) 先看看效果吧,如下图(录制gif软件有点渣,看起来卡卡的...) 这种效果可以由元素内嵌套canves实现,也可以由css3实现。
1366 0
|
算法 JavaScript
weebox弹出窗口不居中显示?
weebox弹出窗口不居中显示?
126 0
|
前端开发
|
C# 数据安全/隐私保护
C#弹出式窗口设计及窗体居屏幕中间
一、功能需求: 某个弹出的窗体可以输入密码,且居屏幕中间。 二、解决方案: 1、解决弹出窗体居中的问题 Form 有个方便的属性,StartPoint可以用来设置Form的特殊位置。
1012 0
|
Web App开发 前端开发
使整个网页变黑白色(灰色)的特效代码
使用方法: 最简单的把页面变成灰色的代码是在head 之间加 <style type="text/css"> html { FILTER: gray } </style> 第一情况:把下面代码复制到你网页的<he
1328 0

热门文章

最新文章