Bigkoo / Android-PickerView

This is a picker view for android , support linkage effect, timepicker and optionspicker.(时间选择器、省市区三级联动)
Apache License 2.0
13.45k stars 3.45k forks source link

弹出Dialog和沉浸式导航栏冲突 #706

Closed DubheBroken closed 5 years ago

DubheBroken commented 5 years ago

弹出Dialog后系统导航栏颜色发生了改变,与沉浸式导航栏相互冲突,能否使导航栏保持原样不变?

弹出Dialog之前↓ screenshot_20190105-160104 弹出Dialog之后↓ screenshot_20190105-160108 沉浸式使用Immersionbar实现 Dialog弹出方法

/**
     * 日期选择器
     */
    private void showDatePicker() {
        Calendar startDate = Calendar.getInstance();
        startDate.set(1900, 1, 1);
        Calendar endDate = Calendar.getInstance();
        Calendar selectDate = Calendar.getInstance();
        selectDate.add(Calendar.YEAR, -10);

        pvTime = new TimePickerBuilder(this, new OnTimeSelectListener() {
            @Override
            public void onTimeSelect(Date date, View v) {//选中事件回调
//                tvTime.setText(getTime(date));
            }
        })
//                .setType(TimePickerView.Type.ALL)//默认全部显示
                .setSubmitText("确定")//确定按钮文字
                .setCancelText("取消")//取消按钮文字
//                .setTitleText("")//标题
                .setSubCalSize(20)//确定和取消文字大小
                .setSubmitColor(getResources().getColor(R.color.black3))//确定按钮文字颜色
                .setCancelColor(getResources().getColor(R.color.black3))//取消按钮文字颜色
                .setTitleBgColor(0xFFDCDCDC)//标题背景颜色 Night mode
                .setBgColor(0xFFF5F5F5)//滚轮背景颜色 Night mode
                .setDividerColor(0xffffffff)
                .setContentTextSize(20)//滚轮文字大小
                .setOutSideCancelable(false)//点击外部dismiss default true
//                .setRange(calendar.get(Calendar.YEAR) - 20, calendar.get(Calendar.YEAR) + 20)//默认是1900-2100年
                .setDate(selectDate)// 如果不设置的话,默认是系统时间*/
                .setRangDate(startDate, endDate)//起始终止年月日设定
                .setLabel("", "", "", "", "", "")
                .isDialog(true)//是否显示为对话框样式
                .setDecorView((ViewGroup) getWindow().getDecorView().findViewById(android.R.id.content))
                .build();
        pvTime.setKeyBackCancelable(true);
        Dialog mDialog = pvTime.getDialog();
        mDialog.setCancelable(true);
        if (mDialog != null) {

            FrameLayout.LayoutParams params = new FrameLayout.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT,
                    Gravity.BOTTOM);

            params.leftMargin = 0;
            params.rightMargin = 0;
            pvTime.getDialogContainerLayout().setLayoutParams(params);

            Window dialogWindow = mDialog.getWindow();
            if (dialogWindow != null) {
                dialogWindow.setWindowAnimations(com.bigkoo.pickerview.R.style.picker_view_slide_anim);//修改动画样式
                dialogWindow.setGravity(Gravity.BOTTOM);//改成Bottom,底部显示
            }
        }
//        pvTime.setOnDismissListener(new OnDismissListener() {
//            @Override
//            public void onDismiss(Object o) {
//                initStatusBar();
//            }
//        });
        pvTime.show();
//        initStatusBar();
    }

沉浸式方法

/**
     * 沉浸式状态栏
     */
    private void initStatusBar() {
        ImmersionBar.with(this)
                .statusBarColor(R.color.white)     //状态栏颜色,不写默认透明色
                .navigationBarColor(R.color.white) //导航栏颜色,不写默认黑色
                .statusBarDarkFont(true)   //状态栏字体是深色,不写默认为亮色
                .navigationBarDarkIcon(true) //导航栏图标是深色,不写默认为亮色
                .flymeOSStatusBarFontColor(R.color.black2)  //修改flyme OS状态栏字体颜色
                .fitsSystemWindows(true)    //解决状态栏和布局重叠问题,任选其一,默认为false,当为true时一定要指定statusBarColor(),不然状态栏为透明色,还有一些重载方法
                .keyboardEnable(true)  //解决软键盘与底部输入框冲突问题,默认为false,还有一个重载方法,可以指定软键盘mode
                .keyboardMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE)  //单独指定软键盘模式
                .setOnKeyboardListener(new OnKeyboardListener() {    //软键盘监听回调
                    @Override
                    public void onKeyboardChange(boolean isPopup, int keyboardHeight) {
//                        Logger.e(isPopup);  //isPopup为true,软键盘弹出,为false,软键盘关闭
                    }
                })
                .init();
    }
DubheBroken commented 5 years ago

试过几种颜色后发现,似乎只有当导航栏颜色设置为亮色系的颜色如白色和淡灰色有这样的现象。深色系颜色可以正常显示。

xiaosong520 commented 5 years ago

@DubheBroken 可修改弹窗的遮罩背景色,或者修改视图容器解决这个问题。

getglory commented 5 years ago

不要使用fitsSystemWindows(true),使用ImmersionBar.with(this).titleBar(mTopbar)。我这么写没问题: ImmersionBar.with(this) .titleBar(mTopbar) .navigationBarColor(R.color.colorPrimary) .statusBarDarkFont(true, 0.2f) .flymeOSStatusBarFontColor(R.color.app_color_black)//修改flymeOS状态栏字体颜色 .init();

另外builder的isDialog属性要设置为false: .isDialog(false)//是否显示为对话框样式 .setDecorView((ViewGroup)getWindow().getDecorView().findViewById(android.R.id.content))

getglory commented 5 years ago

其中mTopbar是我自己的头部标题布局