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

Как добавить программный оттенок

В новой библиотеке AppCompat мы можем подкрасить кнопку следующим образом:

<Button
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/follow"
    android:id="@+id/button_follow"
    android:backgroundTint="@color/blue_100"
    />

Как программно настроить оттенок кнопки в моем коде? Я в основном пытаюсь реализовать условную раскраску кнопки на основе некоторого пользовательского ввода.

4b9b3361

Ответ 1

В соответствии с документацией связанный метод android:backgroundTint - setBackgroundTintList (список ColorStateList)

Обновление

Следуйте этой ссылке , чтобы узнать, как создать ресурс списка состояний цвета.

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item
        android:color="#your_color_here" />
</selector>

затем загрузите его с помощью

setBackgroundTintList(contextInstance.getResources().getColorStateList(R.color.your_xml_name));

где contextInstance - это пример a Context


с помощью AppCompart

btnTag.setSupportButtonTintList(ContextCompat.getColorStateList(Activity.this, R.color.colorPrimary));

Ответ 2

Вы можете использовать

button.setBackgroundTintList(ColorStateList.valueOf(resources.getColor(R.id.blue_100)));

Но я бы порекомендовал вам использовать поддерживаемую библиотеку drawable tinting, которая только что была выпущена вчера:

Drawable drawable = ...;

// Wrap the drawable so that future tinting calls work
// on pre-v21 devices. Always use the returned drawable.
drawable = DrawableCompat.wrap(drawable);

// We can now set a tint
DrawableCompat.setTint(drawable, Color.RED);
// ...or a tint list
DrawableCompat.setTintList(drawable, myColorStateList);
// ...and a different tint mode
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_OVER);

Вы можете найти более в этом сообщении в блоге (см. раздел "Подтягиваемое тонирование" )

Ответ 3

Похоже, что представления имеют собственную механику управления оттенками, поэтому лучше будет добавить список оттенков:

ViewCompat.setBackgroundTintList(
    editText, 
    ColorStateList.valueOf(errorColor));

Ответ 4

В правильном расширении ответа dimsuz путем предоставления реальной ситуации с кодом см. Следующий фрагмент кода:

    Drawable buttonDrawable = button.getBackground();
    buttonDrawable = DrawableCompat.wrap(buttonDrawable);
    //the color is a direct color int and not a color resource
    DrawableCompat.setTint(buttonDrawable, Color.RED);
    button.setBackground(buttonDrawable);

Это решение предназначено для сценария, в котором в качестве фона кнопки используется рисунок. Он также работает на устройствах перед леденцом на палочке.

Ответ 5

Вы пробовали что-то вроде этого?

button.setBackgroundTintList(getResources().getColorStateList(R.id.blue_100));

Обратите внимание, что getResources() будет работать только в действии. Но он может быть вызван и в каждом контексте.

Ответ 6

Вы можете использовать DrawableCompat, например.

public static Drawable setTint(Drawable drawable, int color) {
    final Drawable newDrawable = DrawableCompat.wrap(drawable);
    DrawableCompat.setTint(newDrawable, color);
    return newDrawable;
}

Ответ 7

У меня была аналогичная проблема. Я хотел покрасить сложный рисованный фон для представления, основанного на значении цвета (int). Мне удалось использовать код:

ColorStateList csl = new ColorStateList(new int[][]{{}}, new int[]{color});
textView.setBackgroundTintList(csl);

Где цвет - значение int, представляющее требуемый цвет. Это представляет собой простой xml ColorStateList:

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:color="color here"/>
</selector>

Надеюсь, что это поможет.

Ответ 8

Мне удалось заставить мой работать, используя CompoundButtonCompat.setButtonTintList(button, colour).

Насколько я понимаю, это работает независимо от версии Android.

Ответ 9

Для ImageButton вы можете использовать:

favoriteImageButton.setColorFilter(Color.argb(255, 255, 255, 255)); // White Tint

Ответ 10

это легко сделать с помощью новой кнопки "Материал" из библиотеки материалов. Сначала добавьте зависимость:

implementation 'com.google.android.material:material:1.1.0-alpha07'

затем в своем XML, используйте это для своей кнопки:

<com.google.android.material.button.MaterialButton
    android:id="@+id/accept"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@string/i_accept"
    android:textSize="18sp"
    app:backgroundTint="@color/grayBackground_500" />

и когда вы хотите изменить цвет, здесь код в Kotlin, он не устарел и его можно использовать до Android 21:

accept.backgroundTintList = ColorStateList.valueOf(ResourcesCompat.getColor(resources, 
R.color.colorPrimary, theme))

Ответ 11

Предлагаемый ответ не работает должным образом на Android 5.0, если ваш список состояний цвета на основе XML ссылается на тематические атрибуты. Например, у меня есть список состояний цвета xml, например:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="?colorPrimary" android:state_enabled="true"/>
    <item android:alpha="0.12" android:color="?attr/colorOnSurface"/>
</selector>

Использование этого в качестве фона backgroundTint из xml прекрасно работает на Android 5.0 и во всем остальном. Однако, если я попытаюсь установить это в коде так:

(Не делай этого)

myButton.setSupportButtonTintList(ContextCompat.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

На самом деле не имеет значения, передам ли я Activity или контекст кнопки методу ContextCompat.getColorStateList(), и при этом ни один из них не даст мне правильный список состояний цвета относительно темы, в которой находится кнопка. Это связано с тем, что использование атрибутов темы в списках состояний цветов не поддерживалось до тех пор, пока API 23 и ContextCompat не предпримут ничего особенного для их разрешения. Вместо этого вы должны использовать AppCompatResources.getColorStateList(), который выполняет собственное разрешение для анализа ресурса/атрибута темы на устройствах & lt; API 23.

Вместо этого вы должны использовать это:

myButton.setSupportBackgroundTintList(AppCompatResources.getColorStateList(myButton.getContext(), R.color.btn_tint_primary));

TLDR: используйте AppCompatResources, а не -ContextCompat-, если вам нужны разрешенные тематические ресурсы во всех версиях API для Android.

Для получения дополнительной информации по этой теме см. Эту статью.