diseño de Android: esta etiqueta y sus elementos secundarios se pueden reemplazar por un <TextView /> y un elemento de diseño compuesto

116

Cuando ejecuto el diseño en un archivo XML específico, obtengo esto:

 This tag and its children can be replaced by one <TextView/> 
and a compound drawable

Qué cambio se debe hacer para el siguiente código xml:

<LinearLayout android:id="@+id/name_layout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:background="@drawable/grouplist_single_left_grey_area" >
                <ImageView android:id="@+id/photo_image"
                    android:layout_width="@dimen/thumbnail_width"
                    android:layout_height="@dimen/thumbnail_height"
                    android:paddingBottom="5dip"
                    android:paddingTop="5dip"
                    android:paddingRight="5dip"
                    android:paddingLeft="5dip"
                    android:layout_marginRight="5dip"
                    android:clickable="true"
                    android:focusable="true"
                    android:scaleType="fitCenter"
                    android:src="@*android:drawable/nopicture_thumbnail"
                    android:background="@drawable/photo_highlight" />
                <TextView android:id="@+id/name"
                    android:paddingLeft="5dip"
                    android:layout_weight="1"
                    android:layout_width="0dip"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
            </LinearLayout>

Así es como se ve en la pantalla:

ingrese la descripción de la imagen aquí

El icono de la cámara es el predeterminado. Al hacer clic en eso, el usuario tendrá la opción de elegir otra imagen.

pdilip
fuente
3
+1, porque esta situación parece más compleja de lo que puede manejar un dibujante compuesto. Si no hubiera aceptado la respuesta de Romain, es posible que haya obtenido una respuesta más detallada.
AlbeyAmakiir

Respuestas:

153

Para ampliar la respuesta de Romain Guy, aquí hay un ejemplo.

Antes de:

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:layout_marginTop="10dp"  
android:padding="5dp" >

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="My Compound Button" />

<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_drawable" />
</LinearLayout>

Después:

<TextView  
    android:layout_marginTop="10dp"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="My Compound Button" 
    android:drawableRight="@drawable/my_drawable" android:padding="5dp" />
NPike
fuente
45
Hábil. Pero, ¿qué pasa si necesito establecer propiedades en el dibujable, como definirlo en 60dip x 60dip?
Kyle Clegg
4
Oye, mira eso, todo lo que tenía que hacer era buscar. stackoverflow.com/a/6671544/1224741
QED
@KyleClegg, es posible con una biblioteca personalizada. Vea mi respuesta - stackoverflow.com/a/41347470/2308720
Oleksandr
102

Combine el TextViewy el ImageViewen uno, utilizando los setCompoundDrawable*()métodos de TextView o utilizando android:drawableLeft.

Romain Guy
fuente
30
¿Podría señalarme un ejemplo que ilustre cómo se puede hacer eso? No estoy seguro de cómo se pueden acomodar todos los atributos en ImageView en android: drawableLeft. Gracias
pdilip
1
¿Qué pasa con los atributos de ImageViews como scaleType?
neteinstein
2
¿Cómo aumento el espacio entre la imagen y el texto?
TharakaNirmana
2
setCompoundDrawable * () no funciona, use setCompoundDrawablesWithIntrinsicBounds () en su lugar
Kimo_do
1
@Kimo_do, setCompoundDrawable()no se ocupará de tu dibujable tal como está, tienes que llamarlo setBounds(ver API ). Para configurarlo, puede obtener los límites anteriores usando el TextView.getCompoundDrawables(), accediendo al índice de diseño correcto y finalmente llamando getBounds().
Avinash R
3

A veces es posible reemplazar ImageView(o múltiples) y TextViewcon uno TextViewcon dibujables compuestos. NO hay muchos parámetros que se pueden aplicar al dibujable compuesto usando la API nativa y esta biblioteca TextViewRichDrawable , pero si puede administrar un TextView en lugar de usar LinearLayout, definitivamente debería usarlo .

La lista de atributos y parámetros que se pueden aplicar a los elementos de diseño compuestos:

Tamaño: ( SÍ, de verdad ):

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

Incluso establezca el recurso vectorial como dibujable:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:drawableTopVector="@drawable/some_vector_drawble"
    app:drawableEndVector="@drawable/another_vector_drawable" />

Relleno de Drawable usando API nativa android:drawablePadding-> enlace

Aquí hay un ejemplo:

textView rico dibujable

Oleksandr
fuente
2

A LinearLayoutque contiene un ImageViewy una TextViewse puede manejar de manera más eficiente como un estirable compuesto (una sola TextView, utilizando el drawableTop, drawableLeft, drawableRight y / o drawableBottomatributos para dibujar una o más imágenes adyacentes para el texto).

Si los dos widgets están desplazados entre sí con márgenes, esto se puede reemplazar con un drawablePaddingatributo.

Hay una solución rápida de pelusa para realizar esta conversión en el complemento Eclipse.

De: Documentos API oficiales de Android!

ilikyar
fuente
2

Agregar tools:ignore="UseCompoundDrawables"a <LinearLayout>.

CoolMind
fuente
1

Cuando seguí el código anterior, el texto dentro de TextView no se configura correctamente. Debe establecer su gravedad en el centro | comenzar para lograr lo que se muestra en la pregunta formulada.

La vista de texto se ve así:

   <TextView
        android:id="@+id/export_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawableLeft="@drawable/up_arrow"
        android:drawableStart="@drawable/up_arrow"
        android:gravity="center|start"
        android:text="....."
        android:textSize="@dimen/font_size15" >
    </TextView>
Vikas
fuente
0

Si no desea cambiar ImageView y TextView, puede cambiar la versión en AndroidManifest.xml como:

    <uses-sdk`
    android:minSdkVersion="8"
    android:targetSdkVersion="18" 
    />

Si su versión es android: targetSdkVersion = "17" cámbiela "18".

Espero que esto se rectifique. Lo hice y lo hice bien

Dunken_sai
fuente
-2

Otro enfoque es incrustar ViewImage en otro LinearLayout (permite manejarlo con una sola identificación):

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/blue_3"
            android:layout_gravity="center_horizontal"
            android:paddingTop="16dp" />
    </LinearLayout>
    <TextView 
        android:id="@+id/tvPrompt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:paddingTop="16dp"
        android:text="@string/xy" />

Harvey Triana
fuente
Ahora bien, ¿cuál sería la ventaja de esto? ¿Y por qué está configurando el espacio de nombres dos veces?
ygesher
-5
    This tag and its children can be replaced by one <TextView/> and a compound drawable



    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:contentDescription="."
        android:padding="3dp" 
        android:src="@drawable/tab_home_btn">
    </ImageView>

    <TextView
        android:id="@+id/textview"       
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="首页"
        android:textSize="10sp"
        android:textColor="#ffffff">
    </TextView>

</LinearLayout>
andro_stackoverflow
fuente