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

2023-12-14

我花了很多功夫来改变 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's upper half enter image description here

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

DatePicker's lower half enter image description here

准确地说,我想更改圆圈日期的背景颜色和当前日期的文本颜色(在本例中为 2014 年 3 月 7 日)

有什么提示吗?多谢。

Updates:

翻阅文档后,我发现下半部分的日历实际上是一个 SimpleMonthView.class,并且圆圈的背景颜色和当前日期的 textColor 都由参数 (int) mSelectedDayColor 控制。

    mSelectedDayColor = colors.getColorForState(ENABLED_SELECTED_STATE_SET,
            res.getColor(R.color.holo_blue_light));

我无法使用以前的方法,因为日历是在 onDraw 方法中以编程方式创建的,而不是通过膨胀布局文件来创建的。

所以问题归结为 - 如何更改 mSelectedDayColor 的资源值?

Thanks..

更新: 在研究了 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>

我更改了一些默认值,例如。安卓:最小日期。

在我的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 没有影响。


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

最简单的方法是创建一个重新定义的覆盖主题android:colorAccent并将其应用到你的DatePicker.

res/values/styles.xml:

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

资源/布局/my_layout.xml:

<DatePicker
    ...
    android:theme="@style/MyThemeOverlay" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何更改 Lollipop 中的 DatePicker 日历视图背景颜色? 的相关文章

随机推荐

  • 如何在Spring Security中使用具有authentication-success-handler-ref等效功能的自定义过滤器

    我想将一些带有登录详细信息的参数传递给 spring security 例如某些项目 ID 然后我想根据用户类型重定向到页面 为此我正在使用自定义过滤器发送附加参数 我正在使用重定向身份验证成功处理程序参考 我的问题是 我在使用时遇到位置冲
  • 参数和局部变量有什么区别?

    为看起来一定像的事情道歉very愚蠢的问题 我目前正在通过 codecadamy 工作 这让我很失望 var greeting function name name sausage console log name greeting nam
  • 模式验证器对于 IP 地址正则表达式无效

    我正在使用以下正则表达式来验证IP 地址模式 b 25 0 5 2 0 4 0 9 01 0 9 0 9 3 25 0 5 2 0 4 0 9 01 0 9 0 9 b 我也在a中检查过正则表达式测试器而且效果很好 但是 当我在模式验证器中
  • 在 yii2 中获取日期时间时时间错误

    当我在 yii2 项目中获取日期时间时遇到问题 当我得到日期时间时 日期是正确的 但时间是错误的 我执行我的代码 结果是 2016 05 02 12 30 28 而我笔记本电脑上的时间是 19 30 有什么问题 我利用在印度尼西亚的时间 这
  • Java程序拥有16GB虚拟内存并且不断增长:这是一个问题吗?

    在 Mac OSX 5 8 上 我有一个 Java 程序 它以 100 CPU 运行很长一段时间 几天或更长时间 它是一个分析并发程序的模型检查器 所以这或多或少是预期的 然而 它的虚拟内存大小 如 OSX 的活动监视器中所示 在一天左右后
  • 使用 WCF 中的架构进行消息验证

    我想要的是用很少的属性 例如最小 最大 字符串长度等 来装饰我的数据契约 并获取为我的 SOAP 非 net 客户端生成的 XML 模式 经过在互联网上的一些研究 我发现了以下文章 http wcfsecurity codeplex com
  • 如何将nodeJS项目托管到firebase?

    我正在为该项目使用 Node Express 和更多其他依赖项 我想知道如何在 firebase 上托管这个项目 我的项目将有控制器 视图和任何其他文件夹以使项目成为可能 它已经有像 pug handlebars 这样的视图引擎 在线教程仅
  • C++ 中具有向量属性的 MPI 发送结构

    我想发送一个具有向量属性的结构 typedef struct int id vector
  • ggplot2 代码运行并更新绘图,但实际上没有显示数据

    我正在尝试使用生成图表ggplot2虽然我能够生成我想要使用的图表plot 当我运行下面的 ggplot 代码时 它会显示正确的轴 但没有数据或比例 数据看起来像这样 data lt data frame area c alpha alph
  • 由于 PreviewMouseLeftButtonDown,数据网格内的按钮未被触发

    我正在开发 WPF 应用程序 根据要求 我想在数据网格中显示项目列表 每行还有一个 删除 按钮 使用这个按钮我们可以删除相应的项目 我还想要网格的拖放功能 即用户可以向上 向下移动行 我在用 PreviewMouseLeftButtonDo
  • Codeigniter,空白页,没有错误[关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 public function newreg username this gt inpu
  • headless eclipse 的 config.ini 设置

    From 这个帖子 当我尝试执行无头 Eclipse 代码时出现此错误消息 java lang RuntimeException Could not find framework at org eclipse equinox launche
  • 是否有一种机制可以禁用插入表?

    我有一个表 它的存在纯粹是为了充当某些逻辑的数组 该表应该只有一行 否则我的逻辑将失败 是否有任何 DDL 命令可以禁用插入表 截至目前 我已经插入了逻辑所需的 一行 数据 现在计划创建一个插入后触发器来删除新输入的记录 二 但是我注意到有
  • 使用 Pyinstaller 编译 Gekko

    我想知道是否可能 或者是否有人有任何经验 用 pyinstaller 将 gekko 优化包编译成 exe 作为测试用例 我使用来自 gekko 优化网站的 HS 71 Benchmark 用例 https gekko readthedoc
  • 使用 ncdf4::ncvar_get 时如何指定维度顺序?

    继上一个问题之后 从 netCDF 更快地读取时间序列 我重新排列了我的 netCDF 文件以提供快速的时间序列读取 github上的脚本最终会被清理 简而言之 为了使阅读速度更快 我重新排列了尺寸lat lon time to time
  • jquery remove 从另一个元素中删除

    根据here jquery删除函数应该像这样工作 div remove selector 我正在尝试在这个例子中 HTML div class wrapper p class unwanted This should be removed
  • 从一个表中选择并插入到另外两个表中

    我是 SQL 初学者 对 Transact SQL 不太了解 我意识到这是一个新手问题 但我正在寻找一个简单的解决方案 我有一个包含一些列的表 locationCode CustomerCode 主表 ItemCode locationCo
  • 如何使用来自服务或广播接收器的意图?

    我需要能够在我的活动关闭时处理 捕获意图 所以我正在寻找服务或广播接收器 是否有可能 接收 服务本身的意图 我尝试搜索 但找不到任何有用的东西 对于 BroadcastReceiver 我不太确定它在 Activity 之外是如何工作的 这
  • iOS 6/7 中“没有重用表格单元格的索引路径”消息的含义是什么?

    自从开始使用 iOS 6 以及 iOS 7 编译我的应用程序以来 我开始看到此消息 我知道 UITableViews 管理单元格的方式在 iOS 6 中是不同的 但我不需要修改我的代码来让它继续工作 但我担心此消息可能会指出一些我尚未看到的
  • 如何更改 Lollipop 中的 DatePicker 日历视图背景颜色?

    我花了很多功夫来改变 Lollipop 的 DatePicker 的默认背景颜色 我不能简单地使用 Styleable attrs 来更改默认样式 正如另一篇文章中提到的post 我只能使用反射来找到视图 然后对其进行更改 e g if a