Android复选框样式

use*_*739 43 checkbox android themes styles android-layout

我是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>
Run Code Online (Sandbox Code Playgroud)

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

MH.*_*MH. 121

注意:使用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" />
Run Code Online (Sandbox Code Playgroud)

如您所见,两者都是空声明,只是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>
Run Code Online (Sandbox Code Playgroud)

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

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

<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>
Run Code Online (Sandbox Code Playgroud)

所以这就是真正的魔法发生的地方:基于主题的listChoiceIndicatorMultiple属性,CheckBox确定了它的实际外观.你现在看到的现象很容易解释:因为外观是基于主题的(而不是基于样式的,因为这只是一个空的定义)并且你继承了Theme.Holo,你将总是得到CheckBox与主题相匹配的外观.

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

至于你的第二个问题:

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

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

有没有办法设置主题(带图像的样式)到复选框小部件.(...)无论如何使用这个选择器:链接


更新:

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

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

int id = Resources.getSystem().getIdentifier("btn_check_holo_light", "drawable", "android");
((CheckBox) findViewById(R.id.checkbox)).setButtonDrawable(id);
Run Code Online (Sandbox Code Playgroud)

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

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

显示结果的屏幕截图


UPDATE2:

随着支持库v22.1.0的推出,事情变得更加轻松!发布说明引用(我的重点):

Lollipop添加了通过使用android:themeXML属性在视图级别覆盖视图主题的功能- 对于诸如灯光活动上的暗动作条等事物非常有用.现在,AppCompat允许您使用android:theme工具栏(不赞成app:theme以前使用过的工具栏),甚至更好地android:theme支持API 11+设备上的所有视图.

换句话说:您现在可以在每个视图的基础上应用主题,这使得解决原始问题变得更加容易:只需指定您想要应用于相关视图的主题.即在原始问题的上下文中,比较以下结果:

<CheckBox
    ...
    android:theme="@android:style/Theme.Holo" />

<CheckBox
    ...
    android:theme="@android:style/Theme.Holo.Light" />
Run Code Online (Sandbox Code Playgroud)

第一个CheckBox样式就像在黑暗主题中使用一样,第二个样式就像在浅色主题中一样,无论实际主题设置为您的活动或应用程序.

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

  • @ user1330739:是和否.您不应该依赖内部资源,因为Google可能决定在将来的版本中更改它们.在您的本地资源中包含drawable的副本是您最好的选择.话虽如此,我还有另一个(丑陋的)解决方案,但这只能在运行时工作(意味着你无法在xml文件中引用它).请参阅上面我的回答的编辑. (2认同)

Pra*_*mar 58

也许这会让你满意 -

something.xml

<CheckBox
    android:text="Custom CheckBox"
    android:button="@drawable/checkbox_selector"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>
Run Code Online (Sandbox Code Playgroud)

选择

<?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>
Run Code Online (Sandbox Code Playgroud)

对于,参考仅参考此处


Rém*_*VID 25

材料设计的正确方法是:

风格:

<style name="MyCheckBox" parent="Theme.AppCompat.Light">  
    <item name="colorControlNormal">@color/foo</item>
    <item name="colorControlActivated">@color/bar</item>
</style>  
Run Code Online (Sandbox Code Playgroud)

布局:

<CheckBox  
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:checked="true"
    android:text="Check Box"
    android:theme="@style/MyCheckBox"/>
Run Code Online (Sandbox Code Playgroud)

它将保留Lollipop +上的Material动画.

  • 这样做是有道理的。那么有没有办法全局设置复选框的主题呢? (2认同)

Edw*_*ans 5

也许你想要这样的东西:

<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>
Run Code Online (Sandbox Code Playgroud)

请注意, textColor 项。