disposition android: cette balise et ses enfants peuvent être remplacés par un <TextView /> et un composé dessiné


116

Lorsque j'exécute la mise en page sur un fichier XML spécifique, j'obtiens ceci:

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

Quelle modification doit être effectuée pour le code xml suivant:

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

Voici à quoi cela ressemble à l'écran:

entrez la description de l'image ici

L'icône de la caméra est la valeur par défaut. En cliquant dessus, l'utilisateur aura la possibilité de choisir une autre image.


3
+1, car cette situation semble plus complexe que celle pouvant être gérée par un dessin composé. Si vous n'aviez pas accepté la réponse de Romain, vous auriez peut-être obtenu une réponse plus approfondie.
AlbeyAmakiir

Réponses:


153

Pour développer la réponse de Romain Guy, voici un exemple.

Avant:

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

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

45
Nifty. Mais que faire si j'ai besoin de définir des propriétés sur le dessinable, comme le définir à 60dip x 60dip?
Kyle Clegg

4
Hé regarde ça, tout ce que j'avais à faire était de chercher. stackoverflow.com/a/6671544/1224741
QED

@KyleClegg, c'est possible avec une bibliothèque personnalisée. Voir ma réponse - stackoverflow.com/a/41347470/2308720
Oleksandr

102

Fusionnez le TextViewet le ImageViewen un seul, en utilisant les setCompoundDrawable*()méthodes de TextView ou en utilisant android:drawableLeft.


30
Pourriez-vous me donner un exemple illustrant comment cela peut être fait? Je ne sais pas comment tous les attributs de ImageView peuvent être intégrés dans Android: drawableLeft. Merci
pdilip

1
Qu'en est-il des attributs ImageViews comme scaleType?
neteinstein

2
Comment augmenter l'écart entre l'image et le texte?
TharakaNirmana

2
setCompoundDrawable * () ne fonctionne pas, utilisez plutôt setCompoundDrawablesWithIntrinsicBounds ()
Kimo_do

1
@Kimo_do, setCompoundDrawable()ne s'occupera pas de votre dessinable tel quel, vous devez faire appel setBoundsdessus (voir API ). Pour le définir, vous pouvez obtenir les limites précédentes en utilisant le TextView.getCompoundDrawables(), en accédant au bon index dessinable et enfin en appelant getBounds().
Avinash R


3

Parfois, il est possible de remplacer ImageView(ou de multiples) et TextViewavec un TextViewavec des tiroirs composés. Il n'y a PAS beaucoup de paramètres qui peuvent être appliqués à un composé dessiné à l'aide de l'API native et de cette bibliothèque TextViewRichDrawable , mais si vous pouvez gérer un TextView au lieu d'utiliser LinearLayout, vous devez absolument l'utiliser .

La liste des attributs et paramètres qui peuvent être appliqués aux tirages composés:

Taille: ( OUI, vraiment ):

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

Même définir la ressource vectorielle comme dessinable:

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

Remplissage de Drawable utilisant l'API native android:drawablePadding-> lien

Voici un exemple:

textView rich drawable


2

A , LinearLayoutqui contient un ImageViewet un TextViewpeut être plus efficacement traitées en tant que étirable de composé (un seul TextView, en utilisant la drawableTop, drawableLeft, drawableRight et / ou les drawableBottomattributs de tirer une ou plusieurs images adjacentes au texte).

Si les deux widgets sont décalés l'un de l'autre avec des marges, cela peut être remplacé par un drawablePaddingattribut.

Il existe un correctif rapide de peluches pour effectuer cette conversion dans le plugin Eclipse.

De: Documentation de l'API officielle Android!


2

Ajouter tools:ignore="UseCompoundDrawables"à <LinearLayout>.


1

Lorsque j'ai suivi le code ci-dessus, le texte à l'intérieur du TextView n'est pas défini correctement. Vous devez régler sa gravité au centre | commencer pour obtenir ce qui est indiqué dans la question posée.

La vue textuelle ressemble à ceci:

   <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

Si vous ne souhaitez pas modifier ImageView et TextView, vous pouvez modifier la version dans AndroidManifest.xml comme suit:

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

Si votre version est android: targetSdkVersion = "17" changez-la en "18".

J'espère que cela va rectifier. Je l'ai fait et je l'ai bien fait


-2

Une autre approche consiste à incorporer ViewImage dans un autre LinearLayout (autorisez-le à le gérer avec un seul 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" />


Quel en serait l’avantage? Et pourquoi définissez-vous l'espace de noms deux fois?
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>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.