当前位置:   article > 正文

Android:自定义原生TimePickerDialog样式_android timepickerdialog

android timepickerdialog

效果图:

目标效果图:

原生效果:

实现:

首先是Dialog样式:

  1. <style name="TimePickerDialogStyle" parent="@style/Theme.AppCompat.DayNight.Dialog.Alert">
  2. <item name="android:timePickerStyle">@style/TimePickerStyle</item>
  3. <item name="android:timePickerMode">clock</item>
  4. <item name="dialogCornerRadius">12dp</item>
  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/white</item> <!--顶部背景颜色,原生绿色部分-->
  3. <item name="android:numbersTextColor">@drawable/selector_color</item> <!--外圈的数字颜色-->
  4. <item name="android:numbersInnerTextColor">@drawable/selector_color_inner</item> <!--内圈数字颜色-->
  5. <item name="android:numbersBackgroundColor">@color/white</item> <!--选择区域时钟背景颜色-->
  6. <item name="android:numbersSelectorColor">#3c77fc</item> <!--选中数字背景颜色-->
  7. </style>

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

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

  1. <!--顶部数字颜色,可用selector的方式来声明选中和未选中的颜色-->
  2. <item name="*android:headerTextColor">@color/black</item>

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

  1. <?xml version="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的方式设置不同状态时的颜色。

完。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/278857
推荐阅读
相关标签
  

闽ICP备14008679号