Изменить цвет диалога Datepicker для Android 5.0
Можно ли изменить цветовую схему DatePicker (а также Timepicker) для 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>
Из оригинала:
Чтобы что-то вроде этого:
10 ответов
Причина, по которой предложение Нила приводит к полноэкранному режиму 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.
Я согласен, что предложение Нейла, с небольшими изменениями (сменив родительскую тему на Theme.Material.Light.Dialog
) получит желаемый результат. Но вот другой путь:
При первом осмотре мы сталкиваемся datePickerStyle
который определяет такие вещи, как: headerBackground
(что вы пытаетесь изменить), dayOfWeekBackground
и несколько других текстовых цветов и текстовых стилей.
Переопределение этого атрибута в теме вашего приложения не будет работать. DatePickerDialog
использует отдельную тему, назначаемую атрибутом datePickerDialogTheme
, Таким образом, чтобы наши изменения вступили в силу, мы должны переопределить datePickerStyle
внутри переопределенного datePickerDialogTheme
,
Вот так:
Override datePickerDialogTheme
внутри базовой темы вашего приложения:
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
определять MyDatePickerDialogTheme
, Выбор родительской темы будет зависеть от базовой темы вашего приложения: это может быть либо Theme.Material.Dialog
или же Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Мы переопределили datePickerStyle
со стилем MyDatePickerStyle
, Выбор родителя снова будет зависеть от базовой темы вашего приложения: либо Widget.Material.DatePicker
или же Widget.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
Если вы не хотите так много контроля (настройки), вам не нужно переопределять datePickerStyle
, colorAccent
контролирует большую часть DatePicker's
цвета. Итак, просто переопределив colorAccent
внутри MyDatePickerDialogTheme
должно сработать:
<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
дает вам дополнительное преимущество изменения OK
& CANCEL
цвета текста, а также. Неплохо.
Таким образом, вам не нужно предоставлять какую-либо информацию о стиле 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();
Дайте это попробовать.
Код
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>
Создать новый стиль
<!-- 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);
Результат:
ht tps://stackru.com/images/2d8bcb5526a9e362773260940515e42fcfcf6a5e.png
Попробуй это, работай на меня
Поставь два варианта, colorAccent
а также android: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>
Просто чтобы упомянуть, вы также можете использовать по умолчанию тему, как 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();
У меня была проблема, что кнопки выбора времени не были видны на экране для API 24 в Android. (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>
<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>
У вас нет темы создания, просто напишите ее в объекте создания диалога
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/
Котлин, 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>
Для изменения цвета текста элемента списка "Изменение года" (УКАЗАНО ДЛЯ Android 5.0)
Просто установите определенный цвет текста в стиле диалога выбора даты. По какой-то причине установка флага yearListItemTextAppearance
не отражает никаких изменений в списке года.
<item name="android:textColor">@android:color/black</item>