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 datePickerStylegibi şeyleri tanımlayanlarla karşılaşıyoruz .headerBackgrounddayOfWeekBackground
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 datePickerStyleiçinde geçersiz kılmalıyızdatePickerDialogTheme .
İşte başlıyoruz:
datePickerDialogThemeUygulamanı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.Dialogda ş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 datePickerStyletarzı 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.DatePickerda 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 headerBackgroundvarsayı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 colorAccentiçeriyi geçersiz kılmak MyDatePickerDialogThemeiş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& CANCELmetin 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();