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
같은 사항을 정의 합니다.headerBackground
dayOfWeekBackground
앱 테마에서이 속성을 재정의하면 작동하지 않습니다. 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
는 변경 OK
및 CANCEL
텍스트 색상 의 추가 이점을 제공합니다 . 나쁘지 않다.
이렇게하면 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();