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