Android 5.0 için DatePicker iletişim kutusu rengi nasıl değiştirilir


111

Android 5.0 için tarih seçici (ve ayrıca zamanlayıcı) renk düzenini değiştirmek mümkün müdür?

Vurgu renklerini ayarlamayı denedim, ancak bu işe yaramıyor (hem var hem de yok 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>

Orijinalden: görüntü açıklamasını buraya girin

Bunun gibi bir şeye: görüntü açıklamasını buraya girin


Uygulamanızın tema stillerindeki renk vurgunuz hangi renge ayarlandı
Neil

@Neil Şimdiye kadar şekillendirme için kullanmaya çalıştığım kodu ekledim.
Warpzit

Yanıtlar:


322

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();

8
Nasıl çalıştığına ve stillerde nasıl geçersiz kılınması gerektiğine dair iyi ve tam bir açıklama için teşekkürler
Warpzit

Mükemmel açıklama @Vikram tamam, metin rengini nasıl değiştirebiliriz?
Dilip

1
@Vikram calendarSelectedTextColor bulunamadı.
Akhilesh Dhar Dubey

7
Android <21 the datePicker için geriye dönük uyumlu olmak mümkün mü?
RoCk RoCk

1
@RoCk Ne demek istediğinizden emin değilim, ancak Tarih ve Saat seçicilerini android sürüm 23'ten sürüm 14'e taşımak için bir kitaplık oluşturdum. Proje şu adreste barındırılıyor: https://github.com/vikramkakkar/SublimePicker .
Vikram

68

Bunu bir deneyin.

Kod

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 dosyanızdaki Stil

DÜZENLEME - Önerildiği gibi tema Theme.AppCompat.Light.Dialog olarak değiştirildi

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

2
Evet mor, ama aynı zamanda tam ekran :) ama belki bir parçanın içine koyarsam içerilecek. Tekrar oynamaya başlamadan önce herhangi bir öneriniz var mı?
Warpzit

Tam ekrana geçmesine neden olmayan daha uygun bir çözüm bulup bulamayacağımı göreceğim
Neil

9
Bunun parent="Theme.AppCompat.Light.Dialog"yerine sadece kullanınparent="Theme.AppCompat.Light"
Chupik

@Neil cevabınız için teşekkürler, beni doğru yöne işaret etti ve bu tam anlamıyla en hızlı çözüm ama tamamen stil / tema yaklaşımı
arıyordum

Android 6'da çalışmıyor, tam ekran ve renk değişmiyor
Jemshit Iskenderov

16

Yeni bir stil yaratın

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

Java kodu:

Ana tema burada anahtardır. ColorAccent'inizi seçin

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

Sonuç:

görüntü açıklamasını buraya girin


6

bunu dene, benim için çalış

İki seçeneği koyun colorAccentveandroid: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>

Bu cevap v24 api ve üstü gerektirmez 💪
Michael

3

Sadece bahsetmek gerekirse, android.R.style.Theme_DeviceDefault_Light_Dialogbunun yerine varsayılan bir temayı da kullanabilirsiniz .

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();

1

Tema oluşturmadınız, sadece diyalog oluşturma nesnenize yazın

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

bunu takip edin, size her tür tarih seçici stilini verecek, gerçekten işe yarıyor

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


Gem gibi çalışır, kardeşim!
sam

AlertDialog.THEME_HOLO_LIGHT kullanımdan kaldırıldı .. çalışmıyor
Yash

1

Android'de API 24 için ekranda zaman seçici düğmelerinin görünmemesi sorunu yaşadım. (API 21+) şu şekilde çözüldü:

<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>

1
<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>

0

Yıl listesi öğesinin metin rengini değiştirmek için (ANDROID 5.0 ​​İÇİN ÖZEL)

Tarih seçici diyalog stilinizde belirli metin rengini ayarlamanız yeterlidir. Bazı nedenlerden dolayı bayrak ayarlamak yearListItemTextAppearanceyıl listesinde herhangi bir değişikliği yansıtmaz.

<item name="android:textColor">@android:color/black</item>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.