在v21之前着色checkbox

所以,我想应用色彩到AppCompatcheckbox

一切工作正常棒棒糖:

android:buttonTint="@color/purple_FF4081" 

或者这样:

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

但设置任何这些参数不会改变任何前棒棒糖。 只有在为应用主题设置colorAccent有效。 但是我不希望所有的小部件改变它们的外观,只是一个checkbox。 有没有办法做到这一点,而不设置彩色绘图?

Solutions Collecting From Web of "在v21之前着色checkbox"

在AppCompatActivity和新的支持库的引入之后,现在已经全部改变了,可以通过使用theme atttribute和设置colorControlNormalcolorControlActivated

styles.xml

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

布局xml:

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

你可以直接在xml中着色。 使用buttonTint框(从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" /> 

我需要以编程的方式来完成,经过一段时间的挖掘,我终于find了这个解决scheme(在Kitkat&Marshmallow上testing过),我只是发布它,

 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)); } 

我试过所有的答案,但只有这一个为我工作,添加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> 

编辑6/28/16:下面的答案不再正确。 请参阅Google允许使用appcompat库在v21之前版本的设备上添加新的方法。


原始答案:

最简洁的答案是不。 自定义绘图将需要创build在v21之前的设备上使用。 这是因为特殊的色彩感知小部件目前被隐藏,因为它们目前还是未完成的实现细节(Google声称这可能会在未来发生变化, 根据常见问题部分的开发人员博客 )

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

  • 有你自己的自定义版本的小部件(即,你已经扩展了EditText)
  • 创build没有LayoutInflater的EditText(即调用新的EditText())。