【问题标题】:How to change DatePicker dialog color for Android 5.0如何更改 Android 5.0 的 DatePicker 对话框颜色
【发布时间】:2015-04-28 13:44:22
【问题描述】:

是否可以更改 Android 5.0 的日期选择器(以及时间选择器)配色方案?

我尝试设置强调色,但这不起作用(无论有无android):

<!-- colorPrimary is used for the default action bar background -->
<item name="colorPrimary">@color/purple</item>

<!-- colorPrimaryDark is used for the status bar -->
<item name="colorPrimaryDark">@color/purple_tint</item>

<!-- colorAccent is used as the default value for colorControlActivated
     which is used to tint widgets -->
<item name="colorAccent">@color/purple_tint</item>

来自原文:

到这样的事情:

【问题讨论】:

  • 您在应用主题样式中设置的颜色强调是什么颜色
  • @Neil 我已经添加了到目前为止我尝试用于样式的代码。

标签: android dialog styles background-color


【解决方案1】:

尼尔的建议导致DatePicker全屏的原因是父主题的选择:

<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
    <item name="colorAccent">@color/blue_500</item>
</style>

而且,如果你走这条路线,你必须在创建DatePickerDialog时指定主题:

// R.style.DialogTheme
new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        //DO SOMETHING
    }
}, 2015, 02, 26).show();

在我看来,这并不好。应该尝试将样式保持在 java 之外和 styles.xml/themes.xml 内部。

我同意 Neil 的建议,稍作改动(将父主题更改为 Theme.Material.Light.Dialog)将为您提供所需的结果。但是,这是另一种方式:

在第一次检查时,我们遇到了datePickerStyle,它定义了以下内容:headerBackground(您要更改的内容)、dayOfWeekBackground,以及其他一些文本颜色和文本样式。

在您的应用主题中覆盖此属性将不起作用。 DatePickerDialog 使用由属性datePickerDialogTheme 分配的单独主题。因此,为了使我们的更改生效,我们必须在覆盖的 datePickerDialogTheme 内覆盖 datePickerStyle

我们开始吧:

在应用的基本主题中覆盖 datePickerDialogTheme

<style name="AppBaseTheme" parent="android:Theme.Material.Light">
    ....
    <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>

定义MyDatePickerDialogTheme。父主题的选择取决于您应用的基本主题是什么:它可以是Theme.Material.DialogTheme.Material.Light.Dialog

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
    <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>

我们已经用样式MyDatePickerStyle 覆盖了datePickerStyle。父级的选择将再次取决于您应用的基本主题是什么:Widget.Material.DatePickerWidget.Material.Light.DatePicker。根据您的要求定义它:

<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
    <item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>

目前,我们只覆盖headerBackground,默认设置为?attr/colorAccent(这也是尼尔建议在改变背景时起作用的原因)。但是可以进行很多自定义:

dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor

如果您不想要这么多的控​​制(自定义),则无需覆盖datePickerStylecolorAccent 控制大部分 DatePicker's 颜色。因此,在 MyDatePickerDialogTheme 中仅覆盖 colorAccent 应该可以:

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
    <item name="android:colorAccent">@color/date_picker_accent</item>

    <!-- No need to override 'datePickerStyle' -->
    <!-- <item name="android:datePickerStyle">@style/MyDatePickerStyle</item> -->
</style>

覆盖colorAccent 还为您提供了更改OKCANCEL 文本颜色的额外好处。还不错。

这样您就不必向DatePickerDialog's 构造函数提供任何样式信息。一切都已正确接线:

DatePickerDialog dpd = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {

    }
 }, 2015, 5, 22);

 dpd.show();

【讨论】:

  • 感谢您对它的工作原理以及如何在样式中覆盖它进行了详细而完整的描述
  • @Vikram calendarSelectedTextColor 未找到。
  • 是否可以向后兼容android
  • @RoCk 不确定您的意思,但我构建了一个库来将日期和时间选择器从 android 版本 23 移植到版本 14。该项目托管在:https://github.com/vikramkakkar/SublimePicker
  • 绝妙的答案!我只是想补充一点,我发现android:colorAccent 显然没有覆盖选择圈颜色,但普通的colorAccent 将覆盖both 选择颜色和“OK”/“Cancel”按钮文本。 (或者你可以同时使用不同的颜色!)这是与 AndroidX Material 1.1.0 库一起使用的,并且可能会随着 DatePicker 的不同版本而有所不同。
【解决方案2】:

试试这个。

代码

new DatePickerDialog(MainActivity.this, R.style.DialogTheme, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        //DO SOMETHING
    }
}, 2015, 02, 26).show();

样式在你的styles.xml文件中

编辑 - 按照建议将主题更改为 Theme.AppCompat.Light.Dialog

<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorAccent">@color/blue_500</item>
</style>

【讨论】:

  • 是的,它是紫色的,但也是全屏的:) 但如果我把它放在一个片段中,它可能会被包含在内。在我再次开始使用它之前有什么建议吗?
  • 我看看能不能找到更合适的解决方案,不会导致全屏显示
  • 只需使用parent="Theme.AppCompat.Light.Dialog" 而不是parent="Theme.AppCompat.Light"
  • @Neil 感谢您的回答,为我指明了正确的方向,这确实是最快的解决方案,但我正在寻找一种全风格/主题的方法 :)
  • 不能在android 6上工作,它是全屏的,颜色没有改变
【解决方案3】:

创建新样式

<!-- Theme.AppCompat.Light.Dialog -->
<style name="DialogTheme" parent="Theme.AppCompat.Light.Dialog">
    <item name="colorAccent">@color/blue_500</item>
</style>

Java 代码:

父主题是这里的关键。 选择你的颜色口音

DatePickerDialog = new DatePickerDialog(context,R.style.DialogTheme,this,now.get(Calendar.YEAR),now.get(Calendar.MONTH),now.get(Calendar.DAY_OF_MONTH);

结果:

【讨论】:

    【解决方案4】:

    试试这个,为我工作

    输入两个选项,colorAccentandroid:colorAccent

    <style name="AppTheme" parent="@style/Theme.AppCompat.Light.NoActionBar">
        <!-- Customize your theme here. -->
       ....
        <item name="android:dialogTheme">@style/AppTheme.DialogTheme</item>
        <item name="android:datePickerDialogTheme">@style/Dialog.Theme</item>
    </style>
    
    <style name="AppTheme.DialogTheme" parent="Theme.AppCompat.Light.Dialog">
    
    <!-- Put the two options, colorAccent and android:colorAccent. -->
        <item name="colorAccent">@color/colorPrimary</item>
        <item name="android:colorPrimary">@color/colorPrimary</item>
        <item name="android:colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="android:colorAccent">@color/colorPrimary</item>
     </style>
    

    【讨论】:

    • 这个答案不需要 v24 及以上版本的 api ?
    【解决方案5】:

    顺便提一下,您也可以使用默认主题,例如android.R.style.Theme_DeviceDefault_Light_Dialog

    new DatePickerDialog(MainActivity.this, android.R.style.Theme_DeviceDefault_Light_Dialog, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        //DO SOMETHING
        }
    }, 2015, 02, 26).show();
    

    【讨论】:

      【解决方案6】:

      你没有创建主题,只需将它写在你的对话框创建对象中

      DatePickerDialog datePicker = new DatePickerDialog(getActivity(), AlertDialog.THEME_HOLO_LIGHT,this, mYear, mMonth, mDay);
      

      按照这个它会给你所有类型的日期选择器样式 真的很好用

      http://www.android-examples.com/change-datepickerdialog-theme-in-android-using-dialogfragment/

      【讨论】:

      • 像宝石一样工作,兄弟!
      • AlertDialog.THEME_HOLO_LIGHT 已弃用.. 不工作
      【解决方案7】:

      我遇到的问题是,Android 中的 API 24 屏幕上没有看到时间选择器按钮。 (API 21+) 解决了

      <style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
                  <item name="android:colorAccent">@color/colorPrimary2</item></style>
      
      <style name="Theme" parent="BBaseTheme">
               <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
      </style>
      

      【讨论】:

        【解决方案8】:
        <style name="AppThemeDatePicker" parent="Theme.AppCompat.Light.NoActionBar">
            <item name="colorAccent">@color/select2</item>
            <item name="android:colorAccent">@color/select2</item>
            <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
        </style>
        
        
        <style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
            <item name="android:headerBackground">@color/select2</item>
        </style>
        

        【讨论】:

          【解决方案9】:

          更改年份列表项文本颜色(特定于 ANDROID 5.0)

          只需在您的日期选择器对话框样式中设置某些文本颜色即可。出于某种原因,设置标志 yearListItemTextAppearance 不会反映年份列表上的任何变化。

          <item name="android:textColor">@android:color/black</item>
          

          【讨论】:

            【解决方案10】:

            Kotlin,2021 年

            // set date as button text if pressed
            btnDate.setOnClickListener(View.OnClickListener {
            
                val dpd = DatePickerDialog(
                    this,
                    { view, year, monthOfYear, dayOfMonth ->
                        val selectDate = Calendar.getInstance()
                        selectDate.set(Calendar.YEAR, year)
                        selectDate.set(Calendar.MONTH, monthOfYear)
                        selectDate.set(Calendar.DAY_OF_MONTH, dayOfMonth)
            
                        var formatDate = SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())
                        val date = formatDate.format(selectDate.time)
                        Toast.makeText(this, date, Toast.LENGTH_SHORT).show()
                        btnDate.text = date
                    }, 1990, 6, 6
                )
            
                val calendar = Calendar.getInstance()
                val year = calendar[Calendar.YEAR]
                val month = calendar[Calendar.MONTH]
                val day = calendar[Calendar.DAY_OF_MONTH]
                dpd.datePicker.minDate = GregorianCalendar(year - 90, month, day, 0, 0).timeInMillis
                dpd.datePicker.maxDate = GregorianCalendar(year - 10, month, day, 0, 0).timeInMillis
                dpd.show()
            })
            

            Styles.xml

            <style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
                <!-- This is main Theme Style for your application! -->
                <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
            </style>
            
            <style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Dialog">
                <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
            </style>
            
            <style name="MyDatePickerStyle" parent="@android:style/Widget.Material.DatePicker">
                <item name="android:headerBackground">#A500FF</item>
            </style>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-06-20
              • 2023-02-08
              • 2015-04-10
              • 2013-06-23
              • 1970-01-01
              • 2013-09-13
              • 1970-01-01
              相关资源
              最近更新 更多