Android 5.0에서 DatePicker 대화 상자 색상을 변경하는 방법


111

Android 5.0의 datepicker (및 timepicker) 색 구성표를 변경할 수 있습니까?

강조 색상을 설정하려고 시도했지만 작동하지 않습니다 (포함 및 제외 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 지금까지 스타일링에 사용하려고했던 코드를 추가했습니다.
Warpzit

답변:


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

제 생각에는 이것은 좋지 않습니다. 자바와 styles.xml / themes.xml 내부의 스타일을 유지해야합니다.

나는 Neil의 제안이 약간의 변화 (상위 테마를 변경 Theme.Material.Light.Dialog)로 원하는 결과를 얻을 것이라는 데 동의합니다 . 하지만 다른 방법이 있습니다.

첫 번째 검사에서 (변경하려는 내용) , 및 기타 몇 가지 텍스트 색상 및 텍스트 스타일과 datePickerStyle같은 사항을 정의 합니다.headerBackgrounddayOfWeekBackground

앱 테마에서이 속성을 재정의하면 작동하지 않습니다. DatePickerDialog속성에서 할당 할 수있는 별도의 테마를 사용합니다 datePickerDialogTheme. 따라서 변경 사항을 적용하려면 overriden datePickerStyle내부에서 재정의datePickerDialogTheme 해야합니다 .

여기 있습니다 :

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있습니다 (이것이 Neil 제안이 배경을 변경하는 데 작동하는 이유이기도합니다). 그러나 가능한 많은 사용자 정의가 있습니다.

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는 변경 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
좋은 및 작동 방법에 대한 자세한 설명과 어떻게했다 주셔서 감사합니다 스타일 오버라이드 (override) 할
Warpzit

훌륭한 설명 @Vikram 어떻게 확인하고 텍스트 색상을 취소 할 수 있습니까?
Dilip

1
@Vikram calendarSelectedTextColor를 찾을 수 없습니다.
Akhilesh Dhar Dubey

7
android <21 the datePicker와 하위 호환성을 가질 수 있습니까?
RoCk RoCk

1
@RoCk 무슨 뜻인지 잘 모르겠지만, 날짜 및 시간 선택기를 안드로이드 버전 23에서 버전 14로 다시 이식하기 위해 라이브러리를 구축했습니다. 프로젝트는 https://github.com/vikramkakkar/SublimePicker 에서 호스팅됩니다 .
Vikram

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

나는 그것이 전체 화면 이동이 발생하지 않는 더 적합한 솔루션을 찾을 수 있는지 보자

9
그냥 사용하는 parent="Theme.AppCompat.Light.Dialog"대신parent="Theme.AppCompat.Light"
Chupik

대답을 주셔서 감사합니다 @Neil, 올바른 방향으로 절 지적하고 :)이 제대로 빠른 솔루션입니다하지만 난 모든 스타일 / 테마 방법을 찾고 있었다
Warpzit

아니 안드로이드 6 일, 그것은 전체 화면과 색상이 변경되지 않습니다이다
Jemshit Iskenderov

16

새로운 스타일 만들기

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

자바 코드 :

여기에서 부모 테마가 핵심입니다. 색상을 선택하세요

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

결과:

여기에 이미지 설명 입력


6

시도 해봐, 나를 위해 일해

두 가지 옵션을 입력 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>

이 답변에는 v24 API 이상이 필요하지 않습니다. 💪
Michael

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/


Gem처럼 작동합니다!
sam

AlertDialog.THEME_HOLO_LIGHT deprecated .. not working
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.