Подтвердить что ты не робот

Тонировка флажка на pre v21

Итак, я хочу применить оттенок к флажку AppCompat.

Все отлично работает на Lollipop:

android:buttonTint="@color/purple_FF4081"

или следующим образом:

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

Но установка любого из этих параметров ничего не меняет на пред-Lollipop. Работает, только если я установил colorAccent для темы приложения. Но я не хочу, чтобы все виджеты меняли свой внешний вид, только один флажок. Есть ли способ сделать это без установки цветных чертежей?

4b9b3361

Ответ 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()).