web-dev-qa-db-fra.com

Android TextView DrawableTint sur les appareils pré v23

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>

Et il ressemble, enter image description here

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" />
13
Nishanth Sreedhara

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;
}
13
Nishanth Sreedhara

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.

18
kris larson

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.

3
shinwan