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

一开始以为是我用的姿势不对,试过对style配置状态栏颜色,配置其他可能影响到的属性都没成功,今天google了一下,发现应该是BottomSheetDialog本身实现的问题,见:地址。其中的一条评论认为应该是 BottomSheetDialog 使用的布局为 MATCH_PARENT或者MATCH_PARENT 导致,并通过修改布局高度的方式解决了这个问题,见下面第一种解决方法:
第一种,修改布局高度
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 
 | 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对象:  
| 12
 3
 4
 
 | @Overridepublic Dialog onCreateDialog(Bundle savedInstanceState) {
 return new YourBottomSheetDialog(getContext(), getTheme());
 }
 
 | 
第二种,添加FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志
第二种解决方法是在返回对话框之前,对Window添加一个FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS标志位。它同样是需要继承BottomSheetDialogFragment,并重写以下方法:  
| 12
 3
 4
 5
 6
 7
 8
 
 | @Overridepublic 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;
 }
 
 | 
然而,在部分带底部虚拟导航栏的手机中运行起来会被导航栏挡住一部分。
第三种,设置半透明状态栏
修改方法与第二种类似,代码如下:  
| 12
 3
 4
 5
 6
 7
 8
 
 | @Overridepublic 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系统上直接设置状态栏颜色的行为不一致,所以在项目中也不采用它。