在v21前点击复选框

时间:2014-10-23 15:47:01

标签: android checkbox

所以,我想将色调应用于AppCompat Checkbox。

Lollipop上的一切正常:

android:buttonTint="@color/purple_FF4081"

或者这样:

android:theme="@style/Theme.MyTheme.PurpleAccent"

但设置任何这些参数并不会改变前Lollipop上的任何内容。仅当我为应用主题设置colorAccent时才有效。但我不希望所有小部件都改变它们的外观,只需要一个复选框。 如果没有设置彩色绘图,有没有办法做到这一点?

5 个答案:

答案 0 :(得分:62)

现在,在引入AppCompatActivity和新的支持库之后,这一切都发生了变化,for reference (outlined beautifully here)可以使用theme atttribute并设置colorControlNormal来修改复选框。和colorControlActivated

styles.xml

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

layout xml:

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

答案 1 :(得分:24)

您可以直接在xml中着色。使用boxTint作为框:(从API级别23开始)

<CheckBox
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:buttonTint="@color/CHECK_COLOR" />

您也可以使用appCompatCheckbox v7为旧版API执行此操作:

<android.support.v7.widget.AppCompatCheckBox 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    app:buttonTint="@color/COLOR_HERE" />

答案 2 :(得分:10)

我需要以编程方式进行,经过一段时间的挖掘后我终于找到了这个解决方案(在Kitkat&amp; Marshmallow上测试过),我会发布它,以防它帮助某人:

public static void setAppCompatCheckBoxColors(final AppCompatCheckBox _checkbox, final int _uncheckedColor, final int _checkedColor) {
    int[][] states = new int[][]{new int[]{-android.R.attr.state_checked}, new int[]{android.R.attr.state_checked}};
    int[] colors = new int[]{_uncheckedColor, _checkedColor};
    _checkbox.setSupportButtonTintList(new ColorStateList(states, colors));
}

答案 3 :(得分:2)

我已经尝试了所有答案,但只有这个适用于我,将atttribute colorControlNormalcolorControlActivated添加到整个活动(或应用程序)的基本样式中从控制器中删除主题

这是示例

    <style name="AppTheme" parent="AppTheme.Base"/>

  <style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">

         <!-- colorPrimary is used for the default action bar background -->
        <item name="colorPrimary">@color/colorPrimary</item>

        <!-- colorPrimaryDark is used for the status bar -->
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>

        <!-- colorAccent is used as the default value for colorControlActivated,
             which is used to tint widgets -->
        <item name="colorAccent">@color/colorAccent</item>
      <!-- to hide white screen in start of window -->
      <item name="android:windowIsTranslucent">true</item>

     <item name="colorControlNormal">@color/orange_two</item>
      <item name="colorControlActivated">@color/pumpkin_orange</item>


    </style>

你的主菜

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme"> // here is the style used 
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

答案 4 :(得分:1)

编辑6/28/16:以下答案不再正确。请参阅Google允许使用appcompat库对pre-v21设备进行着色的新方式接受的答案。


原始答案:

简短的回答是:不。需要创建自定义绘图,以便在v21之前的设备上使用。这是因为特殊的色调感知窗口小部件目前是隐藏的,因为它们目前是未完成的实现细节(Google表示将来可能会更改,according to their developer blog在常见问题部分中)

有两种情况可以覆盖可能有效的colorAccent:

  • 拥有自己的小部件自定义版本(即您已扩展 的EditText)
  • 在没有LayoutInflater的情况下创建EditText (即调用新的EditText())。