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


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.


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


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" />
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.