Android 5.0のDatePickerダイアログの色を変更する方法


111

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>

オリジナルから: ここに画像の説明を入力してください

このようなものに: ここに画像の説明を入力してください


アプリのテーマスタイルで設定する色のアクセントは何色ですか
Neil

@Neilこれまでスタイリングに使用しようとしたコードを追加しました。
Warpzit 2015

回答:


322

Neilの提案がフルスクリーンになる理由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などを定義するものが見つかります。headerBackgrounddayOfWeekBackground

アプリのテーマでこの属性をオーバーライドしても機能しません。DatePickerDialog属性で割り当て可能な別のテーマを使用しますdatePickerDialogTheme。したがって、変更を有効にするには、overrided datePickerStyle内でオーバーライドdatePickerDialogThemeする必要あります

さあ行こう:

datePickerDialogThemeアプリの基本テーマ内でオーバーライドします。

<style name="AppBaseTheme" parent="android:Theme.Material.Light">
    ....
    <item name="android:datePickerDialogTheme">@style/MyDatePickerDialogTheme</item>
</style>

を定義しMyDatePickerDialogThemeます。それはどちらかの可能性:親テーマの選択は、アプリケーションの基本テーマが何であるかに依存しますTheme.Material.DialogTheme.Material.Light.Dialog

<style name="MyDatePickerDialogTheme" parent="android:Theme.Material.Light.Dialog">
    <item name="android:datePickerStyle">@style/MyDatePickerStyle</item>
</style>

datePickerStyleスタイルで上書きしていますMyDatePickerStyle。次のいずれかの親の選択は、再び、アプリケーションの基本テーマが何であるかに依存しますWidget.Material.DatePickerWidget.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

これだけの制御(カスタマイズ)が必要ない場合は、をオーバーライドする必要はありませんdatePickerStylecolorAccentほとんどの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すると、変更OKCANCELテキストの色を同様に。悪くない。

この方法では、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();

8
それがどのように機能するか、そしてスタイルでどのようにオーバーライドされなければならないかについての良い完全な説明をありがとう
Warpzit

優れた説明@VikramどのようにしてOKを変更し、テキストの色をキャンセルできますか?
Dilip

1
@Vikram calendarSelectedTextColorが見つかりません。
Akhilesh Dhar Dubey

7
Android <21 the datePickerの下位互換性を保つことは可能ですか?
RoCk RoCk 2016年

1
@RoCk意味がわかりませんが、日付と時刻のピッカーをAndroidバージョン23からバージョン14にバックポートするライブラリを作成しました。プロジェクトはhttps://github.com/vikramkakkar/SublimePickerでホストされています
Vikram、2016年

68

これを試してみてください。

コード

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>

2
はい、それは紫色ですが、フルスクリーンでもあります:)しかし、もし私がそれをフラグメントの中に入れると、それは含まれるでしょう。もう一度試してみる前に何か提案はありますか?
Warpzit 2015

全画面表示にならないより適切な解決策が見つかるかどうかを確認します
Neil

9
parent="Theme.AppCompat.Light.Dialog"代わりに使用parent="Theme.AppCompat.Light"
Chupik

@ニールは答えをありがとう、正しい方向に私を指摘し、これが適切な最も速い解決策ですが、私はすべてのスタイル/テーマのアプローチを探していました:)
Warpzit

Android 6では動作せず、フルスクリーンで色は変更されません
Jemshit Iskenderov

16

新しいスタイルを作成する

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

結果:

ここに画像の説明を入力してください


6

これを試して、私のために働いてください

2つのオプションを配置しcolorAccentandroid: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>

この回答V24 APIを必要とし💪上記しない
マイケル・

3

言うまでもなく、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();

1

あなたはあなたのダイアログ作成オブジェクトにそれを書くだけでテーマを作成していません

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/


ジェムのような作品、仲間!
sam

AlertDialog.THEME_HOLO_LIGHT deprecated ..機能していません
Yash

1

AndroidのAPI 24の画面にタイムピッカーボタンが表示されないという問題がありました。(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>

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

年の変更リストアイテムのテキストの色(Android 5.0に固有)

日付ピッカーダイアログスタイルで特定のテキストの色を設定するだけです。何らかの理由でフラグを設定yearListItemTextAppearanceしても、年リストの変更は反映されません。

<item name="android:textColor">@android:color/black</item>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.