Comment puis-je utiliser un composé dessinable au lieu d'un LinearLayout qui contient une ImageView et une TextView

198

J'ai lancé le nouvel outil Lint contre mon code. Il est venu avec beaucoup de bonnes suggestions, mais celle-ci, je ne peux pas la comprendre.

Cette balise et ses enfants peuvent être remplacés par un et un composé dessinable

Problème: vérifie si le nœud actuel peut être remplacé par un TextView à l'aide de dessins composables.

Un LinearLayout qui contient une ImageView et une TextView peut être traité plus efficacement comme un dessin composé

Et voici ma mise en page

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_centerInParent="true">

<ImageView 
    android:id="@+id/upImage"
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_gravity="center_vertical"
    android:scaleType="centerInside"
    android:src="@drawable/up_count_big">
</ImageView>

<TextView
    android:id="@+id/LikeCount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="2dp"
    android:layout_marginBottom="1dp"
    android:textColor="@color/gray"
    android:textSize="16sp"
    android:layout_gravity="center_vertical">
</TextView>
</LinearLayout>

Quelqu'un peut-il fournir un exemple concret de la façon de rendre un composé étirable dans ce cas?

Leo
la source
4
fwiw c'est l'un des contrôles que je désactive normalement, à cause des faux positifs. Tous TextView/ ImageViewcombos ne peuvent pas être remplacés de cette façon.
Richard Le Mesurier
@RichardLeMesurier Vous pouvez utiliser une vue personnalisée si vous souhaitez définir une taille d'image. Cela rendra votre vue plus claire. Voir ma réponse: stackoverflow.com/a/31916731/2308720
Oleksandr
@Alex Je suis d'accord dans de nombreux cas, mais d'après mon expérience, je n'ai souvent pas la peine de créer une vue personnalisée pour contourner ce que je considère comme un buggy Lint check.
Richard Le Mesurier

Réponses:

258

TextView est livré avec 4 tiroirs composés, un pour chacun des côtés gauche, supérieur, droit et inférieur.

Dans votre cas, vous n'avez pas besoin LinearLayoutet ImageViewdu tout. Ajoutez simplement android:drawableLeft="@drawable/up_count_big"à votre TextView.

Voir TextView # setCompoundDrawablesWithIntrinsicBounds pour plus d'informations.

chiuki
la source
34
pas nécessairement, car votre lien montre un exemple avec une image dynamique. Dans ce cas, il peut toujours être plus facile ou préférable d'utiliser un ImageView. L'avertissement dit «peut être remplacé par», et non «devrait être remplacé par»
David O'Meara
9
mais comment puis-je faire de l'espace entre l'image et le texte
Hitesh Dhamshaniya
7
@Hitesh Dhamshaniya, en utilisant la propriété DrawablePadding en XML ou en code.
Snicolas
2
Dans mon cas, je suis passé à un LinearLayout avec une ImageView / TextView interne parce que l'androïde: drawableLeft n'offrait pas assez de contrôle - donc, ce que vous me dites essentiellement, c'est que cet avertissement / suggestion est un mensonge.
BrainSlugs83
5
Ce n'est pas un mensonge, dans certains cas, un seul TextView pourrait en effet être efficace. Mais en général - oui, ImageView avec TextView offre un contrôle beaucoup plus riche.
ılǝ
20

si pour une raison quelconque vous devez ajouter via le code, vous pouvez utiliser ceci:

mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);

où gauche, en haut, en bas à droite sont Drawables

Javier P
la source
Nécessite l'API 17 ci
Puni
Je ne pense pas, la documentation indique depuis l'API 1
Javier P
Voir ce lien [documentation] ( developer.android.com/reference/android/widget/… , android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))
Puni
ouais notez le relatif dans le nom de la méthode;) Je ne fais pas référence à celui-ci dans la réponse
Javier P
1

Vous pouvez utiliser une implémentation générale de dessin, mais si vous devez définir une taille de dessin, utilisez cette bibliothèque:

https://github.com/a-tolstykh/textview-rich-drawable

Voici un petit exemple d'utilisation:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        app:compoundDrawableHeight="24dp"
        app:compoundDrawableWidth="24dp" />
Oleksandr
la source