Neil'in önerisinin tam ekranla sonuçlanmasının nedeni DatePicker
, ana temanın seçimidir:
<!-- Theme.AppCompat.Light is not a dialog theme -->
<style name="DialogTheme" parent="**Theme.AppCompat.Light**">
<item name="colorAccent">@color/blue_500</item>
</style>
Ayrıca, bu rotaya giderseniz, temayı oluştururken belirtmeniz gerekir 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();
Bu bence iyi değil. Stilleri java dışında ve styles.xml / themes.xml içinde tutmaya çalışılmalıdır.
Neil'in önerisinin, biraz değişiklikle (ana temayı değiştirerek Theme.Material.Light.Dialog
) size istenen sonucu vereceğini kabul ediyorum. Ama işte diğer yol:
İlk incelemede, (neyi değiştirmeye çalıştığınız) ve diğer birkaç metin rengi ve metin stili datePickerStyle
gibi şeyleri tanımlayanlarla karşılaşıyoruz .headerBackground
dayOfWeekBackground
Uygulamanızın temasında bu özelliği geçersiz kılmak işe yaramayacaktır. DatePickerDialog
özniteliğe göre atanabilen ayrı bir tema kullanır datePickerDialogTheme
. Bu nedenle, değişikliklerin etkili olması için, geçersiz kılmanın datePickerStyle
içinde geçersiz kılmalıyızdatePickerDialogTheme
.
İşte başlıyoruz:
datePickerDialogTheme
Uygulamanızın temel temasının içinde geçersiz kılın :
<style name="AppBaseTheme" parent="android:Theme.Material.Light">
....
<item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>
Tanımlayın MyDatePickerDialogTheme
. Ana tema seçimi, uygulamanızın temel temasının ne olduğuna bağlı olacaktır: ya Theme.Material.Dialog
da şunlar olabilir Theme.Material.Light.Dialog
:
<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
<item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>
Biz bunları geçersiz datePickerStyle
tarzı ile MyDatePickerStyle
. Ebeveyn seçimi, uygulamanızın temel temasının ne olduğuna bir kez daha bağlı olacaktır: ya Widget.Material.DatePicker
da Widget.Material.Light.DatePicker
. Gereksinimlerinize göre tanımlayın:
<style name="MyDatePickerStyle" parent="@android:style/Widget.Material.Light.DatePicker">
<item name="android:headerBackground">@color/chosen_header_bg_color</item>
</style>
Şu anda, yalnızca headerBackground
varsayılan olarak ayarlı olanı geçersiz kılıyoruz ?attr/colorAccent
(bu aynı zamanda Neil önerisinin arka planı değiştirmede çalışmasının nedenidir). Ancak oldukça fazla özelleştirme mümkündür:
dayOfWeekBackground
dayOfWeekTextAppearance
headerMonthTextAppearance
headerDayOfMonthTextAppearance
headerYearTextAppearance
headerSelectedTextColor
yearListItemTextAppearance
yearListSelectorColor
calendarTextColor
calendarSelectedTextColor
Bu kadar fazla kontrol (özelleştirme) istemiyorsanız, geçersiz kılmanıza gerek yoktur datePickerStyle
. renklerin colorAccent
çoğunu kontrol eder DatePicker's
. Yani, sadece colorAccent
içeriyi geçersiz kılmak MyDatePickerDialogTheme
işe yaramalı :
<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>
Geçersiz kılma colorAccent
, size OK
& CANCEL
metin renklerini değiştirme gibi ek avantajlar da sağlar. Fena değil.
Bu şekilde kurucuya herhangi bir stil bilgisi vermeniz gerekmez DatePickerDialog's
. Her şey doğru bir şekilde kablolandı:
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();