Cómo uso un elemento de diseño compuesto en lugar de un LinearLayout que contiene una ImageView y una TextView


Ejecuté la nueva herramienta Lint contra mi código. Llegó con un montón de buenas sugerencias, pero esta no puedo entender.

Esta etiqueta y sus hijos pueden ser reemplazados por uno y un elemento de diseño compuesto

Problema: Comprueba si el nodo actual puede ser reemplazado por un TextView usando elementos de diseño compuestos.

Un LinearLayout que contiene una ImageView y una TextView se puede manejar de manera más eficiente como un elemento de diseño compuesto

Y aquí está mi layout

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

¿Puede alguien proporcionar un ejemplo concreto de cómo hacer un elemento de diseño compuesto en este caso?

Author: Leo, 2011-11-30

4 answers

TextView viene con 4 compuesto dibujables, uno para cada uno de izquierda, superior, derecha e inferior.

En su caso, no necesita el LinearLayout y ImageView en absoluto. Simplemente agregue android:drawableLeft="@drawable/up_count_big" a su TextView.

Ver TextView#setCompoundDrawablesWithIntrinsicBounds para más información.

 236
Author: chiuki,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-29 23:20:01

Si por alguna razón necesitas agregar vía código, puedes usar esto:

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

Donde izquierda, arriba, abajo derecha son elementos de diseño

 15
Author: Javier P,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-11 14:37:57

Para agregar a esto-parece importante definir el ancho y alto del elemento de diseño según este post:

(su código funciona)

 3
Author: Richard Le Mesurier,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:24

Puede usar la implementación general de un elemento de diseño compuesto, pero si necesita definir un tamaño de elemento de diseño, 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" />
 2
Author: Oleksandr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-27 14:33:24