如何在安卓中更改DatePicker的样式?

74

我想要改变 Android 中日期/时间选择器对话框的默认颜色,使其与我的应用程序主题匹配。我在谷歌上搜索了解决方法,但是没有找到。

我正在创建一个新样式:

  <style name="datepicker" parent="@android:style/Widget.DeviceDefault.DatePicker">
    <!---TODO-->
    <item name="android:focusedMonthDateColor">@android:color/holo_red_dark</item>
</style>

不知道日期选择器对话框可用的属性是什么。如果有人能够发布相关链接,那就太好了。

在添加样式后,我将其作为主样式进行调用。

 <item name="android:datePickerStyle">@style/datepicker</item>

很不幸,这对我完全没有用。

10个回答

99

像这样进行调用

 button5.setOnClickListener(new View.OnClickListener() {

 @Override
 public void onClick(View v) {
 // TODO Auto-generated method stub

 DialogFragment dialogfragment = new DatePickerDialogTheme();

 dialogfragment.show(getFragmentManager(), "Theme");

 }
 });

public static class DatePickerDialogTheme extends DialogFragment implements DatePickerDialog.OnDateSetListener{

     @Override
     public Dialog onCreateDialog(Bundle savedInstanceState){
     final Calendar calendar = Calendar.getInstance();
     int year = calendar.get(Calendar.YEAR);
     int month = calendar.get(Calendar.MONTH);
     int day = calendar.get(Calendar.DAY_OF_MONTH);

//for one

//for two 

 DatePickerDialog datepickerdialog = new DatePickerDialog(getActivity(),
 AlertDialog.THEME_DEVICE_DEFAULT_DARK,this,year,month,day);

//for three 
 DatePickerDialog datepickerdialog = new DatePickerDialog(getActivity(),
 AlertDialog.THEME_DEVICE_DEFAULT_LIGHT,this,year,month,day);

// for four

   DatePickerDialog datepickerdialog = new DatePickerDialog(getActivity(),
 AlertDialog.THEME_HOLO_DARK,this,year,month,day);

//for five

 DatePickerDialog datepickerdialog = new DatePickerDialog(getActivity(),
     AlertDialog.THEME_HOLO_LIGHT,this,year,month,day);

//for six

 DatePickerDialog datepickerdialog = new DatePickerDialog(getActivity(),
 AlertDialog.THEME_TRADITIONAL,this,year,month,day);


     return datepickerdialog;
     }

     public void onDateSet(DatePicker view, int year, int month, int day){

     TextView textview = (TextView)getActivity().findViewById(R.id.textView1);

     textview.setText(day + ":" + (month+1) + ":" + year);

     }
     }

跟随这个链接,它将为您提供各种类型的日期选择器样式(从此复制)

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

输入图像描述

输入图像描述

输入图像描述


4
@WolfJee 使用如下代码: int theme; if (Build.VERSION.SDK_INT < 23) theme = AlertDialog.THEME_HOLO_DARK; else theme = android.R.style.Theme_Holo_Dialog; new DatePickerDialog(getActivity(), theme, date,...... - kaya
非常好的答案,如果您不想在应用程序的样式和主题上进行任何更改,仅适用于datePicker。但是,您刚刚搞乱了示例图像的编号,例如THEME_DEVICE_DEFAULT_LIGHT对应第二张图片,我认为。此外,对于API> 23的上述代码,我现在正在收到已弃用的错误。 - Shirish Herwade
4
我讨厌谷歌的新“材料”风格日期选择器,因为用户根本不知道可以通过点击左上角来更改年份!!这太糟糕的用户体验了! - Someone Somewhere
@WolfJee,你找到解决方案了吗? - Someone Somewhere
我能改变圆角半径吗? - sejn
显示剩余2条评论

72

试试这个。这是最简单和最有效的方法。

<style name="datepicker" parent="Theme.AppCompat.Light.Dialog">
        <item name="colorPrimary">@color/primary</item>
        <item name="colorPrimaryDark">@color/primary_dark</item>
        <item name="colorAccent">@color/primary</item>
</style>

2
如何设置按钮样式?我尝试设置 buttonBarNegativeButtonStylebuttonBarNeutralButtonStylebuttonBarPositiveButtonStylebuttonStyle,但没有反映。 - Kavin Raju S
我有同样的问题,无法更改按钮样式。 - Mahdi
Kotlin 没有产生任何效果。 - J A S K I E R

64

要在应用程序级别更改DatePicker颜色(日历模式),请定义以下属性。

<style name="MyAppTheme" parent="Theme.AppCompat.Light">
    <item name="colorAccent">#ff6d00</item>
    <item name="colorControlActivated">#33691e</item>
    <item name="android:selectableItemBackgroundBorderless">@color/colorPrimaryDark</item>
    <item name="colorControlHighlight">#d50000</item>
</style>

请查看http://www.zoftino.com/android-datepicker-example以获取其他DatePicker的自定义样式。

zoftino DatePicker examples


1
我该如何更改按钮文本颜色? - Mahdi
@Mahdi,请查看Rohit的答案(那将改变按钮文本颜色)。 - user1300214

61
创建一个新样式。
<style name="my_dialog_theme" parent="ThemeOverlay.AppCompat.Dialog">
    <item name="colorAccent">@color/colorAccent</item>                   <!--header background-->
    <item name="android:windowBackground">@color/colorPrimary</item>     <!--calendar background-->
    <item name="android:colorControlActivated">@color/colorAccent</item> <!--selected day-->
    <item name="android:textColorPrimary">@color/colorPrimaryText</item> <!--days of the month-->
    <item name="android:textColorSecondary">@color/colorAccent</item>    <!--days of the week-->
</style>

然后初始化对话框

Calendar mCalendar = new GregorianCalendar();
mCalendar.setTime(new Date());

new DatePickerDialog(mContext, R.style.my_dialog_theme, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
        //do something with the date
    }
}, mCalendar.get(Calendar.YEAR), mCalendar.get(Calendar.MONTH), mCalendar.get(Calendar.DAY_OF_MONTH)).show();

结果:

这里输入图片描述


2
我该如何更改按钮样式或按钮文本颜色? - Mahdi
@Mahdi,请查看Rohit的答案(那将改变按钮文本颜色)。 - user1300214
如果在 XML 中使用 DatePicker 会怎样? - user924

22
Calendar calendar = Calendar.getInstance();

DatePickerDialog datePickerDialog = new DatePickerDialog(getActivity(), R.style.DatePickerDialogTheme, new DatePickerDialog.OnDateSetListener() {
  public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
    Calendar newDate = Calendar.getInstance();
    newDate.set(year, monthOfYear, dayOfMonth);

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MM-yyyy");
    String date = simpleDateFormat.format(newDate.getTime());
  }
}, calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH), calendar.get(Calendar.DAY_OF_MONTH));

datePickerDialog.show();

并使用这种样式:

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

如果在XML中使用DatePicker会怎样? - user924

11

自定义DatePickerDialog样式:

<style name="AppTheme.DatePickerDialog" parent="Theme.MaterialComponents.Light.Dialog">
    <item name="android:colorAccent">@color/colorPrimary</item>
    <item name="android:colorControlActivated">@color/colorPrimaryDark</item>
    <item name="android:buttonBarPositiveButtonStyle">@style/AppTheme.Alert.Button.Positive</item>
    <item name="android:buttonBarNegativeButtonStyle">@style/AppTheme.Alert.Button.Negative</item>
    <item name="android:buttonBarNeutralButtonStyle">@style/AppTheme.Alert.Button.Neutral</item>
</style>

<style name="AppTheme.Alert.Button.Positive" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="android:textColor">@color/buttonPositive</item>
</style>

<style name="AppTheme.Alert.Button.Negative" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="android:textColor">@color/buttonNegative</item>
</style>

<style name="AppTheme.Alert.Button.Neutral" parent="Widget.MaterialComponents.Button.TextButton">
    <item name="android:textColor">@color/buttonNeutral</item>
</style>

在应用程序主题中设置自定义datePickerDialogTheme样式:

<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
    <item name="android:datePickerDialogTheme">@style/AppTheme.DatePickerDialog</item>
</style>

在初始化时通过编程方式设置主题,如下所示:
val datetime = DatePickerDialog(this, R.style.AppTheme_DatePickerDialog)

2
谢谢。之前我的正负按钮是看不见/白色的,现在已经解决了。 - Daniyal Javaid
它运行得非常好。谢谢你的分享... - Hitesh Dhamshaniya

9

我正在使用React Native;targetSdkVersion 22。我试图改变一个日历日期选择器对话框的外观。接受的答案对我没有起作用,但这个方法有效。希望这段代码对你们中的一些人有所帮助。

<style name="CalendarDatePickerDialog"  parent="Theme.AppCompat.Light.Dialog">
    <item name="colorAccent">#6bf442</item>
    <item name="android:textColorPrimary">#6bf442</item>
</style>

这不是与被接受的答案相同的代码片段吗? - silverFoxA
2
几乎一样,但名称不同。将名称设置为“datepicker”对我没有起作用,但将其更改为“CalendarDatePickerDialog”使其起作用。 - Nunchucks

8
由于AlertDialog.THEME属性已过时,因此在创建DatePickerDialog时,您应将以下参数之一传递给int themeResId
  • android.R.style.Theme_DeviceDefault_Dialog_Alert
  • android.R.style.Theme_DeviceDefault_Light_Dialog_Alert
  • android.R.style.Theme_Material_Light_Dialog_Alert
  • android.R.style.Theme_Material_Dialog_Alert

3

对于DayNight主题:

  1. Create theme for date/time picker:

    <style name="App.Dialog.DateTime" parent="Theme.AppCompat.DayNight.Dialog">
        <item name="colorAccent">?attr/clAccent</item>
        <item name="android:windowBackground">?attr/clPrimary</item>
        <item name="android:buttonBarNegativeButtonStyle">@style/App.Dialog.NegativeButton</item>
    
        <!--  For overScrollMode  -->
        <item name="android:colorEdgeEffect">?attr/clAccentRipple</item>
        <item name="android:overScrollMode">ifContentScrolls</item>
    </style>
    
    <style name="App.Dialog.NegativeButton" parent="@style/Widget.AppCompat.Button.ButtonBar.AlertDialog">
        <item name="android:textColor">?attr/clContentSecond</item>
    </style>
    

    You may specify styles for different dialog buttons (like I did it via App.Dialog.NegativeButton)

    Also, I tried another parent theme (for App.Dialog.DateTime): Theme.AppCompat.DayNight.Dialog.Alert, but result looked ugly with strange dialog window sizes.

  2. Setup date/time picker theme inside your app theme:

    <item name="android:datePickerDialogTheme">@style/App.Dialog.DateTime</item>
    <item name="android:timePickerDialogTheme">@style/App.Dialog.DateTime</item>
    

结果:

日期选择器对话框的样式

如需更多对话框自定义,请查看此答案中的xml键。


1
这是唯一对我有效的解决方案,可能是因为这种样式继承了@style/Widget.AppCompat.Button.ButtonBar.AlertDialog,但不确定。 - jordi casas

1
如果你在XML中使用DatePicker,你所要做的就是像@theBeardedPilot提到的那样为你的对话框添加一个样式,如下所示:
<style name="DialogTheme" parent="ThemeOverlay.AppCompat.Dialog">
    <!--header background-->
    <item name="colorAccent">@android:color/holo_green_dark</item>
    <!--selected day-->
    <item name="android:colorControlActivated">@android:color/holo_red_dark</item>
    <!--days of the month-->
    <item name="android:textColorPrimary">@android:color/holo_orange_dark</item>
    <!--days of the week-->
    <item name="android:textColorSecondary">@android:color/holo_blue_dark</item>
</style>

然后使用android:theme属性调用此样式,如下所示:

<DatePicker
    android:theme="@style/DialogTheme"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接