¿Cómo uso un dibujo compuesto en lugar de un LinearLayout que contiene un ImageView y un TextView

198

Ejecuté la nueva herramienta Lint contra mi código. Surgió con muchas buenas sugerencias, pero esta no la puedo entender.

Esta etiqueta y sus elementos secundarios se pueden reemplazar por uno y un dibujo compuesto

Problema: Comprueba si el nodo actual puede ser reemplazado por un TextView usando elementos dibujables compuestos.

Un LinearLayout que contiene un ImageView y un TextView se puede manejar de manera más eficiente como un dibujo compuesto

Y aquí está mi diseño

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

¿Alguien puede proporcionar un ejemplo concreto de cómo hacer un compuesto dibujable en este caso?

León
fuente
44
fwiw esa es una de las verificaciones que normalmente desactivo, debido a los falsos positivos. No todos TextView/ ImageViewcombos se pueden reemplazar de esta manera.
Richard Le Mesurier
@RichardLeMesurier Puede usar una vista personalizada si desea definir un tamaño de imagen. Esto hará que su vista sea más clara. Vea mi respuesta: stackoverflow.com/a/31916731/2308720
Oleksandr
@Alex Estoy de acuerdo en muchos casos, sin embargo, según mi experiencia, a menudo no vale la pena crear una vista personalizada para evitar lo que considero una comprobación de pelusas con errores.
Richard Le Mesurier

Respuestas:

258

TextView viene con 4 elementos dibujables compuestos, uno para cada uno de los lados izquierdo, superior, derecho e inferior.

En su caso, no necesita el LinearLayouty ImageViewpara nada. Solo agrégalo android:drawableLeft="@drawable/up_count_big"a tu TextView.

Consulte TextView # setCompoundDrawablesWithIntrinsicBounds para obtener más información.

chiuki
fuente
34
no necesariamente, ya que su enlace muestra un ejemplo con una imagen dinámica. En ese caso, aún puede ser más fácil o preferible usar un ImageView. La advertencia dice 'puede ser reemplazado por', no 'debe ser reemplazado por'
David O'Meara
9
pero ¿cómo puedo hacer algo de espacio entre imagen y texto
Hitesh Dhamshaniya
77
@Hitesh Dhamshaniya, utilizando la propiedad DrawablePadding en XML o código.
Snicolas
2
En mi caso, me mudé a un LinearLayout con un ImageView / TextView interno porque el android: drawableLeft no ofrecía suficiente control, entonces, lo que básicamente me estás diciendo es que esta advertencia / sugerencia es una mentira.
BrainSlugs83
55
No es mentira, en algunos casos un solo TextView podría ser eficiente. Pero en general, sí, ImageView con TextView proporciona un control mucho más rico.
ılǝ
20

si por alguna razón necesita agregar un código, puede usar esto:

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

donde izquierda, arriba, abajo a la derecha están Drawables

Javier P
fuente
Requerir API 17 arriba
Puni
No lo creo, la documentación indica desde API 1
Javier P
Consulte este enlace [documentación] ( developer.android.com/reference/android/widget/… , android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))
Puni
sí, tenga en cuenta el pariente en el nombre del método;) No me refiero a este en la respuesta
Javier P
1

Puede usar una implementación dibujable compuesta general, pero si necesita definir un tamaño de dibujo, use esta biblioteca:

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

Aquí hay un pequeño ejemplo de uso:

<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
fuente