如何在 Lollipop 中更改 DatePicker 日历视图的背景颜色?
How to change DatePicker's CalendarView's background color in Lollipop?
我费尽心思更改了 Lollipop 的 DatePicker 的默认背景颜色。我不能简单地使用 Styleable attrs 来更改默认样式。并且在另一个post中提到,我只能使用反射来找到视图,然后对其进行更改。
例如
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int monthDayYearLayoutId = Resources.getSystem().getIdentifier("date_picker_month_day_year_layout", "id", "android");
if (monthDayYearLayoutId != 0) {
View monthDayYearLayout = datePicker.findViewById(monthDayYearLayoutId);
if (monthDayYearLayout != null) {
monthDayYearLayout.setBackgroundColor(getResources().getColor(R.color.colorful));
}
}
}
但是,我只能访问 DatePicker 的上半部分(见下文)。
DatePicker 的上半部分
但是,对于 CalendarView 的下半部分(见下文),我无法使用相同的方法进行更改,因为我找不到视图(我试图通过 ID R.id.calendar_view 找到视图,但它不工作。)。
DatePicker 的下半部分
准确的说,我想更改圈出日期的背景颜色,以及当前日期的textColor(本例中为2014年3月7日)
有什么提示吗?非常感谢。
更新:
看了文档,发现下半部分的日历其实是一个SimpleMonthView.class,圆圈的背景颜色和当天的textColor都是由param (int ) mSelectedDayColor。
mSelectedDayColor = colors.getColorForState(ENABLED_SELECTED_STATE_SET,
res.getColor(R.color.holo_blue_light));
我不能使用以前的方法,因为日历是在 onDraw 方法中以编程方式创建的,而不是通过扩充布局文件创建的。
所以问题归结为 - 如何更改 mSelectedDayColor 的资源值?
谢谢..
更新:
在研究了 alanv 的解决方案之后,我尝试了这个:
由于我正在使用 Lollipop 的 DatePicker,我将以下内容放入 v21-styles.xml:
<style name="MyCalendarView" parent="@android:style/Widget.CalendarView">
<item name="android:showWeekNumber">true</item>
<item name="android:minDate">01/01/2016</item>
<item name="android:maxDate">12/31/2100</item>
<item name="android:shownWeekCount">6</item>
<item name="android:selectedWeekBackgroundColor">#330099FF</item>
<item name="android:focusedMonthDateColor">#FFFFFFFF</item>
<item name="android:unfocusedMonthDateColor">#66FFFFFF</item>
<item name="android:weekNumberColor">#33FFFFFF</item>
<item name="android:weekSeparatorLineColor">#19FFFFFF</item>
</style>
并且我更改了一些默认值,例如。 android:minDate.
在我的 activity_main.xml,
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/date_picker"
android:layout_centerHorizontal="true"
android:theme="@style/MyCalendarView"/>
但对 Lollipop 的 DatePicker 没有影响。
任何使用反射的代码都可能在以后的 OS 更新中中断。您永远不应使用反射来访问私有 API 或值。
最简单的方法是创建一个重新定义 android:colorAccent
的叠加主题并将其应用到您的 DatePicker
。
res/values/styles.xml:
<style name="MyThemeOverlay">
<item name="android:colorAccent">@color/my_accent</item>
</style>
res/layout/my_layout.xml:
<DatePicker
...
android:theme="@style/MyThemeOverlay" />
如果您想在没有 xml
的情况下以编程方式执行此操作,follow this link
我费尽心思更改了 Lollipop 的 DatePicker 的默认背景颜色。我不能简单地使用 Styleable attrs 来更改默认样式。并且在另一个post中提到,我只能使用反射来找到视图,然后对其进行更改。
例如
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int monthDayYearLayoutId = Resources.getSystem().getIdentifier("date_picker_month_day_year_layout", "id", "android");
if (monthDayYearLayoutId != 0) {
View monthDayYearLayout = datePicker.findViewById(monthDayYearLayoutId);
if (monthDayYearLayout != null) {
monthDayYearLayout.setBackgroundColor(getResources().getColor(R.color.colorful));
}
}
}
但是,我只能访问 DatePicker 的上半部分(见下文)。
DatePicker 的上半部分
但是,对于 CalendarView 的下半部分(见下文),我无法使用相同的方法进行更改,因为我找不到视图(我试图通过 ID R.id.calendar_view 找到视图,但它不工作。)。
DatePicker 的下半部分
准确的说,我想更改圈出日期的背景颜色,以及当前日期的textColor(本例中为2014年3月7日)
有什么提示吗?非常感谢。
更新:
看了文档,发现下半部分的日历其实是一个SimpleMonthView.class,圆圈的背景颜色和当天的textColor都是由param (int ) mSelectedDayColor。
mSelectedDayColor = colors.getColorForState(ENABLED_SELECTED_STATE_SET,
res.getColor(R.color.holo_blue_light));
我不能使用以前的方法,因为日历是在 onDraw 方法中以编程方式创建的,而不是通过扩充布局文件创建的。
所以问题归结为 - 如何更改 mSelectedDayColor 的资源值?
谢谢..
更新: 在研究了 alanv 的解决方案之后,我尝试了这个: 由于我正在使用 Lollipop 的 DatePicker,我将以下内容放入 v21-styles.xml:
<style name="MyCalendarView" parent="@android:style/Widget.CalendarView">
<item name="android:showWeekNumber">true</item>
<item name="android:minDate">01/01/2016</item>
<item name="android:maxDate">12/31/2100</item>
<item name="android:shownWeekCount">6</item>
<item name="android:selectedWeekBackgroundColor">#330099FF</item>
<item name="android:focusedMonthDateColor">#FFFFFFFF</item>
<item name="android:unfocusedMonthDateColor">#66FFFFFF</item>
<item name="android:weekNumberColor">#33FFFFFF</item>
<item name="android:weekSeparatorLineColor">#19FFFFFF</item>
</style>
并且我更改了一些默认值,例如。 android:minDate.
在我的 activity_main.xml,
<DatePicker
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/date_picker"
android:layout_centerHorizontal="true"
android:theme="@style/MyCalendarView"/>
但对 Lollipop 的 DatePicker 没有影响。
任何使用反射的代码都可能在以后的 OS 更新中中断。您永远不应使用反射来访问私有 API 或值。
最简单的方法是创建一个重新定义 android:colorAccent
的叠加主题并将其应用到您的 DatePicker
。
res/values/styles.xml:
<style name="MyThemeOverlay">
<item name="android:colorAccent">@color/my_accent</item>
</style>
res/layout/my_layout.xml:
<DatePicker
...
android:theme="@style/MyThemeOverlay" />
如果您想在没有 xml
的情况下以编程方式执行此操作,follow this link