layout Android: questo tag e i suoi figli possono essere sostituiti da un <TextView /> e da un drawable composto


116

Quando eseguo il layout su un file XML specifico, ottengo questo:

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

Quale modifica dovrebbe essere eseguita per il seguente codice 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>

Ecco come appare sullo schermo:

inserisci qui la descrizione dell'immagine

L'icona della fotocamera è l'impostazione predefinita. Facendo clic su questo si darà all'utente la possibilità di scegliere un'altra immagine.


3
+1, perché questa situazione sembra più complessa di quanto possa essere gestita dal drawable composto. Se non avessi accettato la risposta di Romain, avresti potuto ottenere una risposta più approfondita.
AlbeyAmakiir

Risposte:


153

Per espandere la risposta di Romain Guy, ecco un esempio.

Prima:

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

Dopo:

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

45
Nifty. Ma cosa succede se ho bisogno di impostare le proprietà sul drawable, come definirlo su 60dip x 60dip?
Kyle Clegg

4
Ehi guarda qua, tutto quello che dovevo fare era cercare. stackoverflow.com/a/6671544/1224741
QED

@KyleClegg, è possibile con una libreria personalizzata. Vedi la mia risposta - stackoverflow.com/a/41347470/2308720
Oleksandr

102

Unisci il TextViewe il ImageViewin uno, usando i setCompoundDrawable*()metodi di TextView o usando android:drawableLeft.


30
Potresti indicarmi un esempio che illustri come ciò può essere fatto? Non sono sicuro di come tutti gli attributi in ImageView possano essere sistemati in Android: drawableLeft. Grazie
pdilip

1
Che dire degli attributi ImageViews come scaleType?
Neteinstein

2
Come si aumenta la distanza tra l'immagine e il testo?
TharakaNirmana

2
setCompoundDrawable * () non funziona, usa invece setCompoundDrawablesWithIntrinsicBounds ()
Kimo_do

1
@Kimo_do, setCompoundDrawable()non si prenderà cura del tuo disegnabile così com'è, devi chiamarlo setBounds(vedi API ). Per impostarlo, puoi ottenere i limiti precedenti utilizzando il TextView.getCompoundDrawables(), accedendo all'indice disegnabile corretto e infine chiamando getBounds().
Avinash R


3

A volte è possibile sostituire ImageView(o multiplo) e TextViewcon uno TextViewcon trafilabili composti. NON ci sono molti parametri che possono essere applicati al drawable composto usando l'API nativa e questa libreria TextViewRichDrawable , ma se puoi gestire un TextView invece di usare LinearLayout dovresti assolutamente usarlo .

L'elenco degli attributi e dei parametri che possono essere applicati ai drawable composti:

Dimensioni: ( SÌ, davvero ):

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

Imposta anche la risorsa vettoriale come disegnabile:

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

Padding di Drawable utilizzando API native android:drawablePadding-> link

Ecco un esempio:

textView rich drawable


2

Una LinearLayoutquali contiene una ImageViewe TextViewpossono essere gestiti in modo più efficiente come drawable composto (una sola TextView, con il drawableTop, drawableLeft, drawableRight e / o drawableBottomattributi per disegnare una o più immagini adiacenti al testo).

Se i due widget sono sfalsati l'uno dall'altro con margini, questo può essere sostituito con un drawablePaddingattributo.

È disponibile una correzione rapida dei lanugine per eseguire questa conversione nel plug-in Eclipse.

Da: documenti API ufficiali di Android!


2

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


1

Quando ho seguito il codice sopra, il testo all'interno di TextView non è impostato correttamente. È necessario impostare la sua gravità al centro | inizia per ottenere ciò che viene mostrato nella domanda posta.

La visualizzazione del testo ha questo aspetto:

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

0

Se non vuoi cambiare ImageView e TextView, puoi cambiare la versione in AndroidManifest.xml come:

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

Se la tua versione è android: targetSdkVersion = "17" cambiala in "18".

Spero che questo risolverà. L'ho fatto e ho capito bene


-2

Un altro approccio è incorporare la ViewImage in un altro LinearLayout (consenti di gestirlo con un solo id):

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


Ora quale sarebbe il vantaggio di questo? E perché stai impostando lo spazio dei nomi due volte?
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>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.