如何在Lollipop中更改DatePicker日历视图背景颜色?

时间:2015-03-20 16:00:26

标签: android android-5.0-lollipop android-custom-view

我努力改变Lollipop的DatePicker的默认背景颜色。我不能简单地使用Styleable attrs来改变默认样式。正如另一个post中所提到的,我只能使用反射来查找视图,然后对其进行更改。

e.g。

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的上半部分 enter image description here

但是,对于作为CalendarView的下半部分(见下文),我无法使用相同的方法进行更改,因为我找不到视图(我试图通过id R.id.calendar_view找到视图,但它不管用。)。

DatePicker的下半部分 enter image description here

确切地说,我想更改带圆圈的日期的背景颜色,以及当前日期的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>

我改变了一些默认值,例如。机器人:。的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没有任何影响。

2 个答案:

答案 0 :(得分:2)

使用反射的任何代码可能会在未来的操作系统更新中中断您永远不应该使用反射来访问私有API或值。

最简单的方法是创建重新定义android:colorAccent并将其应用于DatePicker的重叠主题。

RES /值/ styles.xml:

<style name="MyThemeOverlay">
    <item name="android:colorAccent">@color/my_accent</item>
</style>

RES /布局/ my_layout.xml:

<DatePicker
    ...
    android:theme="@style/MyThemeOverlay" />

答案 1 :(得分:0)

如果要以编程方式在没有xmlfollow this link

的情况下进行操作