Тонировка флажка на pre v21
Итак, я хочу применить оттенок к флажку AppCompat.
Все отлично работает на Lollipop:
android:buttonTint="@color/purple_FF4081"
или следующим образом:
android:theme="@style/Theme.MyTheme.PurpleAccent"
Но установка любого из этих параметров ничего не меняет на пред-Lollipop. Работает, только если я установил colorAccent
для темы приложения. Но я не хочу, чтобы все виджеты меняли свой внешний вид, только один флажок.
Есть ли способ сделать это без установки цветных чертежей?
Ответы
Ответ 1
Quick fyi, что все это изменилось теперь после введения AppCompatActivity и новых библиотек поддержки для справки (выделено красиво здесь) флажок может быть тонирован используя атрибут 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"/>
Ответ 2
Вы можете покрасить непосредственно в 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" />
Ответ 3
Мне нужно было сделать это программно, после копания на некоторое время я наконец нашел это решение (проверено на Kitkat и 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));
}
Ответ 4
Я пробовал весь ответ, но только этот работает для меня, добавьте atttribute colorControlNormal
и colorControlActivated
в базовый стиль всей активности (или приложения), удаляйте тему с вашего контроллера.
вот пример
<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>
Ответ 5
РЕДАКТИРОВАТЬ 6/28/16: Следующий ответ больше не правильный. См. Принятый ответ по новому способу, которым Google разрешила тонирование на устройствах pre-v21 с помощью библиотеки appcompat.
Исходный ответ:
Короткий ответ: нет. Пользовательские чертежи должны быть созданы для использования на устройствах pre-v21. Это связано с тем, что в настоящее время скрытые специальные виджеты скрыты, поскольку в настоящее время они являются незавершенной деталью реализации (что Google заявляет, что это может измениться в будущем, в соответствии с в блог разработчиков в разделе FAQ)
Есть два сценария, которые вы могли бы переопределить colorAccent, который может работать:
- У вас есть собственная версия виджета (т.е. расширенный
EditText)
- Создание EditText без LayoutInflater
(т.е. вызов нового EditText()).