Как добавить программный оттенок
В новой библиотеке 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"
/>
Как программно настроить оттенок кнопки в моем коде? Я в основном пытаюсь реализовать условную раскраску кнопки на основе некоторого пользовательского ввода.
Ответы
Ответ 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.
Для получения дополнительной информации по этой теме см. Эту статью.