Android复选框样式

时间:2012-04-13 05:04:18

标签: android android-layout checkbox styles themes

我是Android的新手,我正在尝试为我的应用程序中的所有复选框设置样式。我的应用程序样式设置为Theme.Holo,它是黑暗的,我想我的列表视图上的复选框是样式Theme.Holo.Light。我不是要创建自定义样式。下面的代码似乎不起作用,根本没有任何事情发生。我需要这样做,因为我的列表视图有一个浅色纸纹理,复选框和复选框文本是白色的,我想要黑暗。

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo">
    <item name="android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>

<style name="customCheckBoxStyle" parent="@android:style/Widget.Holo.Light.CompoundButton.CheckBox">
</style>

如果您为应用程序设置样式,还可以为各个小部件设置样式吗?

5 个答案:

答案 0 :(得分:118)

注意:使用Android支持库v22.1.0并定位API级别11及更高版本?向下滚动到上次更新。


  

我的应用程序样式设置为Theme.Holo,它是黑暗的,我愿意   像我的列表视图上的复选框是样式Theme.Holo.Light。   我不是要创建自定义样式。下面的代码似乎没有   工作,没有任何事情发生。

首先,为什么系统会出现这种行为可能并不明显,但是当你真正研究这些机制时,你很容易推断它。让我一步一步带你完成它。

首先,让我们来看看Widget.Holo.Light.CompoundButton.CheckBox样式定义的内容。为了使事情更清楚,我还添加了“常规”(非光)样式定义。

<style name="Widget.Holo.Light.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />

<style name="Widget.Holo.CompoundButton.CheckBox" parent="Widget.CompoundButton.CheckBox" />

正如您所看到的,两者都是空声明,只是将Widget.CompoundButton.CheckBox包装在一个不同的名称中。那么让我们来看看那种父母风格。

<style name="Widget.CompoundButton.CheckBox">
    <item name="android:background">@android:drawable/btn_check_label_background</item>
    <item name="android:button">?android:attr/listChoiceIndicatorMultiple</item>
</style>

此样式引用背景和按钮可绘制。 btn_check_label_background只是一个9补丁,因此在这个问题上并不是很有趣。但是,?android:attr/listChoiceIndicatorMultiple表示某些基于当前主题的属性(这一点很重要)将决定CheckBox的实际外观。

由于listChoiceIndicatorMultiple是一个主题属性,您将找到多个声明 - 每个主题一个(如果从父主题继承,则为无)。这将如下所示(为清楚起见省略了其他属性):

<style name="Theme">
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check</item>
    ...
</style>

<style name="Theme.Holo">
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_dark</item>
    ...
</style>

<style name="Theme.Holo.Light" parent="Theme.Light">
    <item name="listChoiceIndicatorMultiple">@android:drawable/btn_check_holo_light</item>
    ...
</style>

这就是真正的魔法发生的地方:根据主题的listChoiceIndicatorMultiple属性,确定CheckBox的实际外观。您现在看到的现象很容易解释:因为外观是基于主题的(并且基于样式,因为这只是一个空的定义)并且您继承自{{1} },您将始终获得与主题匹配的Theme.Holo外观。

现在,如果您想将CheckBox的外观更改为Holo.Light版本,则需要复制这些资源,将它们添加到本地资源并使用自定义样式进行应用它们。

至于你的第二个问题:

  

如果您为应用程序设置样式,还可以为各个小部件设置样式吗?

当然,他们将覆盖任何活动或应用程序集样式。

  

有没有办法将主题(带图像的样式)设置为复选框   小部件。 (...)无论如何都要使用这个选择器:link


<强>更新

让我首先再说一遍,你不应该依赖Android的内部资源。有一个原因你不能随意访问内部命名空间。

然而,一种访问系统资源的方法是通过名称进行id查找。请考虑以下代码段:

CheckBox

第一行实际上将返回int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android"); ((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id); 可绘制资源的资源ID。由于我们之前已经确定这是确定btn_check_holo_light外观的按钮选择器,我们可以在窗口小部件上将其设置为“按钮可绘制”。无论您在xml中的应用程序,活动或窗口小部件上设置了什么主题/样式,结果都是CheckBox,其外观为CheckBox。由于这只设置了可绘制按钮,因此您需要手动更改其他样式;例如关于文字外观。

显示结果的屏幕截图下方。顶部复选框使用上述方法(我手动将文本颜色设置为xml中的黑色),而第二个复选框使用默认的基于主题的Holo.Light样式(非光,即)。

Screenshot showing the result


<强> UPDATE2:

使用the introduction of Support Library v22.1.0,事情变得更加轻松!发布说明引用(我的重点):

  

Lollipop通过使用Holo XML属性添加了在视图级别的视图中覆盖主题的功能 - 对于诸如光活动中的暗动作条等事物非常有用。现在,AppCompat允许您使用android:theme工具栏(弃用之前使用的android:theme),甚至更好,为API 11+设备上的所有视图提供app:theme支持。< /强>

换句话说:您现在可以在每个视图的基础上应用主题,这样可以更轻松地解决原始问题:只需指定您想要申请相关的主题视图。即在原始问题的上下文中,比较下面的结果:

android:theme

第一个<CheckBox ... android:theme="@android:style/Theme.Holo" /> <CheckBox ... android:theme="@android:style/Theme.Holo.Light" /> 的样式就像在黑暗主题中使用一样,第二个就像在浅色主题中一样,无论您的活动或应用程序设置的实际主题如何。

当然你不应该再使用Holo主题,而是使用Material。

答案 1 :(得分:56)

也许这会让你满意 -

<强> something.xml

<CheckBox
    android:text="Custom CheckBox"
    android:button="@drawable/checkbox_selector"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>

<强>选择

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" android:drawable="@drawable/star_down" />
    <item android:state_checked="false" android:drawable="@drawable/star" />
</selector>

因为,参考只是参考here

答案 2 :(得分:21)

为材料设计执行此操作的正确方法是:

风格:

<style name="MyCheckBox" parent="Theme.AppCompat.Light">  
    <item name="colorControlNormal">@color/foo</item>
    <item name="colorControlActivated">@color/bar</item>
</style>  

布局:

<CheckBox  
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:text="Check Box"
    android:theme="@style/MyCheckBox"/>

它将保留Lollipop +上的材质动画。

答案 3 :(得分:4)

也许你想要这样的东西:

<style name="CustomActivityTheme" parent="@android:style/Theme.Holo">
    <item name="android:checkboxStyle">@style/customCheckBoxStyle</item>
</style>

<style name="customCheckBoxStyle" parent="@android:style/Widget.CompoundButton.CheckBox">
    <item name="android:textColor">@android:color/black</item>
</style>

注意,textColor项目。

答案 4 :(得分:1)

在上一个答案中,<selector>...</selector>部分也可能需要:

<item android:state_pressed="true" android:drawable="@drawable/checkbox_pressed" ></item>