Existe-t-il un moyen de teinter le Drawable
utilisé dans le TextView
? DrawableTint
fonctionne uniquement au niveau API 23 et supérieur.
Actuellement, j'utilise un Vertical Linear Layout
pour répondre à mes besoins.
<LinearLayout style="@style/ChoiceIllustratorIconTextContainerStyle">
<ImageView
style="@style/ChoiceIllustratorImageStyle"
Android:contentDescription="@string/cd_university"
Android:src="@drawable/ic_account_balance_white_24dp" />
<TextView
style="@style/ChoiceIllustratorTextStyle"
Android:text="@string/ci_text_university" />
</LinearLayout>
Le studio Android me propose d'utiliser Compound Drawble
avec TextView
pour y parvenir. Et je peux y arriver, mais je ne trouve pas de moyen de Tint
le dessinable.
<TextView
style="@style/ChoiceIllustratorTextStyle"
Android:drawablePadding="4dp"
Android:drawableTop="@drawable/ic_account_balance_white_24dp"
Android:text="@string/ci_text_university" />
Cette réponse est basée sur la suggestion de @kris larson.
J'utilise les méthodes suivantes et cela fonctionne bien sur tous les appareils.
setTintedCompoundDrawable
une méthode personnalisée qui prend le TextView
sur lequel vous souhaitez définir le composé drawable, un drawable res id & et le res id de votre choix de couleur.
private void setTintedCompoundDrawable(TextView textView, int drawableRes, int tintRes) {
textView.setCompoundDrawablesWithIntrinsicBounds(
null, // Left
Utils.tintDrawable(ContextCompat.getDrawable(getContext(), drawableRes),
ContextCompat.getColor(getContext(), tintRes)), // Top
null, // Right
null); //Bottom
// if you need any space between the icon and text.
textView.setCompoundDrawablePadding(12);
}
La méthode Tint tintDrawable
se présente comme suit:
public static Drawable tintDrawable(Drawable drawable, int tint) {
drawable = DrawableCompat.wrap(drawable);
DrawableCompat.setTint(drawable, tint);
DrawableCompat.setTintMode(drawable, PorterDuff.Mode.SRC_ATOP);
return drawable;
}
La façon programmatique de le faire est
Drawable[] drawables = textView.getCompoundDrawables();
if (drawables[0] != null) { // left drawable
drawables[0].setColorFilter(color, Mode.MULTIPLY);
}
Cela fonctionne pour tous les niveaux d'API.
C'est votre meilleure option pour les appareils pré-marshmallow.
La bibliothèque compatible AndroidX app prend en charge la teinture dans TextView depuis la version 1.1.0-alpha03 [ ref ].
Ajouter des dépendances à la bibliothèque compatible avec les applications
dependencies {
implementation "androidx.appcompat:appcompat:1.1.0"
}
Ensuite, le dessin dans TextView peut être teinté de XML comme ceci
<TextView
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
app:drawableStartCompat="@drawable/ic_plus"
app:drawableTint="@color/red" />
N'oubliez pas d'inclure
xmlns:app="http://schemas.Android.com/apk/res-auto"
et pour étendre votre activité de AppCompatActivity
.