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.