2010-07-09 10 views
97

Quando eseguo layout su un file XML specifico, ottengo questo:layout di Android: Questo tag ed i suoi figli possono essere sostituiti da una <TextView/> e un composto disegnabile

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

Quale cambiamento dovrebbe essere fatto 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> 

Questo è come sembra sullo schermo:

enter image description here

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

+1

+1, perché questa situazione appare più complessa di quanto può essere gestita da drawable composto. Se non avessi accettato la risposta di Romain, avresti ottenuto una risposta più approfondita. – AlbeyAmakiir

risposta

136

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

Nifty. Ma cosa succede se ho bisogno di impostare le proprietà sul drawable, come definirlo a 60dip x 60dip? –

+4

Ehi guarda, tutto quello che dovevo fare era cercare. http://stackoverflow.com/a/6671544/1224741 – QED

+0

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

100

unire i TextView e ImageView in uno, utilizzando i metodi di setCompoundDrawable*() TextView, o utilizzando android:drawableLeft.

+29

Potrebbe indicarmi un esempio che illustra come si può fare? Non sono sicuro di come tutti gli attributi di ImageView possano essere adattati in Android: drawableLeft. Grazie – pdilip

+1

Che dire degli attributi di ImageViews come scaleType? – neteinstein

+2

Come aumentare il divario tra l'immagine e il testo? – TharakaNirmana

18

ho pensato di provare a ottenere alcuni puntos extra per questo così: è possibile aggiungere imbottitura tra l'immagine e il testo utilizzando android:drawablePadding. https://stackoverflow.com/a/6671544/1224741

+3

E tu eri corretta! +1 –

-2

Un altro approccio è incorporare la viewImage in un'altra LinearLayout (consentire gestire con 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" /> 

+0

Ora quale sarebbe il vantaggio di questo? E perché stai impostando lo spazio dei nomi due volte? – ygesher

2

Un LinearLayout che contiene un ImageView e TextView può essere più efficiente trattati come un composto estraibile (un singolo TextView, utilizzando lo drawableTop, drawableLeft, drawableRight e/o drawableBottom attributi 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 attributo drawablePadding.

È disponibile un quickfix per la filaccia per eseguire questa conversione nel plug-in Eclipse .

Da: documenti API ufficiali Android!

0

Se non si desidera modificare l'ImageView e TextView, è possibile modificare la versione nella AndroidManifest.xml come:

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

Se la versione è Android: targetSdkVersion = "17" cambia it s "18".

Spero che questo risolva.L'ho fatto e ho capito bene

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

Quando ho seguito il codice sopra, il testo all'interno di TextView non è impostato correttamente. È necessario impostare la gravità per centrare | iniziare a ottenere quanto mostrato nella domanda.

Il TextView assomiglia a questo:

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

A volte è possibile sostituire ImageView (o multiplo) e TextView con una TextView con disegnabile composto (s). NON ci sono molti parametri che possono essere applicati al composto drawable usando l'API nativa e questo TextViewRichDrawable library, ma se puoi gestire un TextView invece di usare LinearLayout dovresti sicuramente usarlo.

L'elenco degli attributi e dei parametri che può essere applicato a drawable composti:

Dimensioni: (SI, 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"/> 

Anche risorsa vettore serie come drawable:

<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 disegnabile utilizzando l'API nativa android:drawablePadding ->link

Ecco un esempio:

textView rich drawable

Problemi correlati