Android:自定义原生TimePickerDialog样式

效果图:

目标效果图:

Android:自定义原生TimePickerDialog样式_第1张图片

原生效果:

Android:自定义原生TimePickerDialog样式_第2张图片

实现:

首先是Dialog样式:

声明有圆角,时间选择器的模式是时钟选择模式。原来按钮样式也打算在这里用比如buttonBarPositiveButtonStyle这种来声明的,但是没有效果,所以按钮部分我用的动态代码设置的方式修改。

public void showTimePicker(){
        TimePickerDialog timePickerDialog = new TimePickerDialog(
                this, R.style.TimePickerDialogStyle, null, 0, 0, true);
        Window window = timePickerDialog.getWindow();
        WindowManager.LayoutParams attributes = window.getAttributes();
        attributes.gravity = Gravity.BOTTOM;
        window.setAttributes(attributes);
        timePickerDialog.setOnShowListener(dialog -> {
            attributes.width = WindowManager.LayoutParams.MATCH_PARENT;
            window.setAttributes(attributes);
            
            Button buttonPositive = timePickerDialog.getButton(DialogInterface.BUTTON_POSITIVE);
            buttonPositive.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
            buttonPositive.setBackgroundResource(R.drawable.test_shape);
            buttonPositive.setTextColor(Color.WHITE);
            buttonPositive.setWidth(320);

            Button buttonNegative = timePickerDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
            buttonNegative.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
            buttonNegative.setBackgroundResource(R.drawable.test_shape);
            buttonNegative.setTextColor(Color.WHITE);
            buttonNegative.setWidth(320);

            LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) buttonNegative.getLayoutParams();
            layoutParams.setMarginEnd(40);
            layoutParams.height = 125;
            buttonPositive.setLayoutParams(layoutParams);
            buttonNegative.setLayoutParams(layoutParams);

        });
        timePickerDialog.show();
    }

然后是关键的timepicker样式:

parent用ThemeOverlay.MaterialComponents.TimePicker默认顶部大时钟字体颜色是白色,parent用的@android:style/Widget.Material.TimePicker,默认顶部大时钟字体颜色是黑色。如果要其他颜色的话使用android:headerTextColor属性,但是编译的时候会报错,这个属性是私有的,不允许直接使用:

Android:自定义原生TimePickerDialog样式_第3张图片

解决方案也很简单,前面加一个“*”,编译就可以通过了:


@color/black  

然后是外圈和内圈数字字体颜色,直接设置颜色的话在选中之后颜色是不变的,我们看原生的选中之后是会变成白色的,所以那个颜色我们需要用selector的drawable文件来声明不同激活状态的颜色:



    
    

前面说的headerTextColor的时钟和分钟选择状态的颜色也可以通过这种selector的方式设置不同状态时的颜色。

完。

你可能感兴趣的:(Android,android,timepicker,dialog,自定义,style)