注意:使用Android支持库v22.1.0并定位到API级别11或更高版本吗? 向下滚动到最新更新。
我的应用程序样式设置为Theme.Holo,它很暗,我会 就像我的列表视图上的复选框是Theme.Holo.Light样式。 我不是要创建自定义样式。 下面的代码似乎没有 工作,什么都没有发生。
乍一看,为什么系统会表现出这种行为可能并不明显,但是当您实际研究机械原理时,您可以轻松推断出它。 让我逐步引导您。
首先,让我们看一下Widget.Holo.Light.CompoundButton.CheckBox样式的定义。 为了使事情更清楚,我还添加了“常规”(非轻型)样式定义。
如您所见,这两个都是空声明,只是将CheckBox用另一个名称包装。 因此,让我们看一下父样式。
@android:drawable/btn_check_label_background
?android:attr/listChoiceIndicatorMultiple
此样式同时引用了背景和按钮可绘制。 CheckBox仅仅是9个补丁,因此就此而言不是很有趣。 但是,android:theme指示基于当前主题的某些属性(这对实现很重要)将确定app:theme的实际外观。
由于CheckBox是主题属性,因此您会找到多个声明-每个主题一个(如果从父主题继承而则没有一个)。 如下所示(为清楚起见,省略了其他属性):
@android:drawable/btn_check
...
@android:drawable/btn_check_holo_dark
...
@android:drawable/btn_check_holo_light
...
因此,真正的魔力发生了:根据主题的CheckBox属性,确定android:theme的实际外观。 现在可以轻松地解释您所看到的现象:由于外观是基于主题的(而不是基于样式的,因为这只是一个空的定义),并且您是从app:theme继承的,因此您将始终获得与Holo.Light相匹配的外观 主题。
现在,如果要将CheckBox的外观更改为Holo.Light版本,则需要复制这些资源,将它们添加到本地资产中,并使用自定义样式来应用它们。
至于第二个问题:
如果您为应用程序设置样式,还可以为各个小部件设置样式吗?
绝对如此,它们将覆盖任何活动或应用程序设置的样式。
有什么办法可以将主题(带有图像的样式)设置为复选框 小部件。 (...)反正有使用此选择器的链接吗?
更新:
让我再次开始说,您不应该依赖Android的内部资源。 您不能随意访问内部名称空间是有原因的。
但是,毕竟,访问系统资源的一种方法是按名称进行id查找。 考虑以下代码片段:
int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);
第一行实际上将返回CheckBox可绘制资源的资源ID。 由于我们之前确定这是确定android:theme外观的按钮选择器,因此我们可以在小部件上将其设置为“可绘制按钮”。 结果是app:theme具有Holo.Light版本的外观,无论您在xml中的应用程序,活动或窗口小部件上设置了什么主题/样式。 由于这仅设置可绘制的按钮,因此您将需要手动更改其他样式。 例如 关于文字外观。
屏幕截图下方显示了结果。 顶部的复选框使用上述方法(我在xml中手动将文本颜色设置为黑色),而第二个复选框使用了基于主题的默认样式CheckBox256(非轻型)。
更新2:
随着支持库v22.1.0的引入,事情变得更加容易了! 发行说明中的一句话(我的重点):
Lollipop添加了使用CheckBox XML属性在逐个视图级别覆盖主题的功能-对于诸如轻活动上的黑暗操作栏之类的东西非常有用。 现在,AppCompat允许您将android:theme用于工具栏(不赞成使用以前使用的app:theme),甚至更好的是,为API 11+设备上的所有视图带来了CheckBox支持。
换句话说:您现在可以基于每个视图应用主题,这使得解决原始问题变得容易得多:只需指定您想要为相关视图应用的主题即可。 即 在原始问题的上下文中,比较以下结果:
...
android:theme="@android:style/Theme.Holo" />
...
android:theme="@android:style/Theme.Holo.Light" />
无论您为活动或应用程序设置了什么实际主题,第一个CheckBox的样式都好像在深色主题中使用,第二个样式似乎在浅色主题中使用。
当然,您不应再使用Holo主题,而应使用Material。