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



в новой библиотеке 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"
/>


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

618   9  

9 ответов:

по словам документация соответствующий метод 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 экземпляр Context


С помощью AppCompart

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

вы могли бы использовать

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);

Вы можете найти более в этой статье (см. раздел "Рисование тонировки")

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

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

при правильном расширении ответа 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);

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

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

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

вы пробовали что-то подобное?

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

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

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

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

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

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

надеюсь, что это помогает.

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

в моем понимании это работает независимо от версии Android.

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

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

Comments

    Ничего не найдено.