• Android:自定义原生TimePickerDialog样式


    效果图:

    目标效果图:

    原生效果:

    实现:

    首先是Dialog样式:

    1. <style name="TimePickerDialogStyle" parent="@style/Theme.AppCompat.DayNight.Dialog.Alert">
    2. <item name="android:timePickerStyle">@style/TimePickerStyleitem>
    3. <item name="android:timePickerMode">clockitem>
    4. <item name="dialogCornerRadius">12dpitem>
    5. style>

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

    1. public void showTimePicker(){
    2. TimePickerDialog timePickerDialog = new TimePickerDialog(
    3. this, R.style.TimePickerDialogStyle, null, 0, 0, true);
    4. Window window = timePickerDialog.getWindow();
    5. WindowManager.LayoutParams attributes = window.getAttributes();
    6. attributes.gravity = Gravity.BOTTOM;
    7. window.setAttributes(attributes);
    8. timePickerDialog.setOnShowListener(dialog -> {
    9. attributes.width = WindowManager.LayoutParams.MATCH_PARENT;
    10. window.setAttributes(attributes);
    11. Button buttonPositive = timePickerDialog.getButton(DialogInterface.BUTTON_POSITIVE);
    12. buttonPositive.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
    13. buttonPositive.setBackgroundResource(R.drawable.test_shape);
    14. buttonPositive.setTextColor(Color.WHITE);
    15. buttonPositive.setWidth(320);
    16. Button buttonNegative = timePickerDialog.getButton(DialogInterface.BUTTON_NEGATIVE);
    17. buttonNegative.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
    18. buttonNegative.setBackgroundResource(R.drawable.test_shape);
    19. buttonNegative.setTextColor(Color.WHITE);
    20. buttonNegative.setWidth(320);
    21. LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) buttonNegative.getLayoutParams();
    22. layoutParams.setMarginEnd(40);
    23. layoutParams.height = 125;
    24. buttonPositive.setLayoutParams(layoutParams);
    25. buttonNegative.setLayoutParams(layoutParams);
    26. });
    27. timePickerDialog.show();
    28. }

    然后是关键的timepicker样式:

    1. <style name="TimePickerStyle" parent="@android:style/Widget.Material.TimePicker">
    2. <item name="android:headerBackground">@color/whiteitem>
    3. <item name="android:numbersTextColor">@drawable/selector_coloritem>
    4. <item name="android:numbersInnerTextColor">@drawable/selector_color_inneritem>
    5. <item name="android:numbersBackgroundColor">@color/whiteitem>
    6. <item name="android:numbersSelectorColor">#3c77fcitem>
    7. style>

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

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

    1. <item name="*android:headerTextColor">@color/blackitem>

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

    1. "1.0" encoding="utf-8"?>
    2. <selector xmlns:android="http://schemas.android.com/apk/res/android">
    3. <item android:state_activated="true" android:color="@color/white" />
    4. <item android:state_activated="false" android:color="@color/black" />
    5. selector>

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

    完。

  • 相关阅读:
    算法学习——贪心算法
    QStyleFactor和QPalette
    华为OD机试真题-勾股数元组-2023年OD统一考试(B卷)
    Unity摄像机跟随
    【Flutter】使用Android Studio 创建第一个flutter应用。
    【瑞萨零基础入门】瑞萨MCU零基础入门系列教程(更新连载中)
    JWT(2):JWT入门使用
    SMSBMS超市订单管理系统详解(一:准备工作)
    一张图读懂「融云一站式全生态出海解决方案」
    Open3D 进阶(15)方向向量约束的PCA快速粗配准
  • 原文地址:https://blog.csdn.net/qq_35584878/article/details/133696418