Флажок тонировки на 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()).
Другие вопросы по тегам