Android-Layout: Dieses Tag und seine untergeordneten Elemente können durch ein <TextView /> und ein zusammengesetztes Zeichen ersetzt werden

116

Wenn ich das Layout für eine bestimmte XML-Datei ausführe, wird Folgendes angezeigt:

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

Welche Änderung sollte für den folgenden XML-Code vorgenommen werden:

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

So sieht es auf dem Bildschirm aus:

Geben Sie hier die Bildbeschreibung ein

Das Kamerasymbol ist die Standardeinstellung. Wenn Sie darauf klicken, kann der Benutzer ein anderes Bild auswählen.

pdilip
quelle
3
+1, weil diese Situation komplexer aussieht, als es mit zusammensetzbaren Zeichen möglich ist. Wenn Sie Romains Antwort nicht akzeptiert hätten, hätten Sie möglicherweise eine ausführlichere Antwort erhalten.
AlbeyAmakiir

Antworten:

153

Um die Antwort von Romain Guy zu erweitern, hier ein Beispiel.

Vor:

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

Nach dem:

<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
quelle
45
Raffiniert. Aber was ist, wenn ich Eigenschaften für das Zeichenobjekt festlegen muss, z. B. 60dip x 60dip?
Kyle Clegg
4
Hey schau dir das an, alles was ich tun musste war suchen. stackoverflow.com/a/6671544/1224741
QED
@ KyleClegg, Es ist mit einer benutzerdefinierten Bibliothek möglich. Siehe meine Antwort - stackoverflow.com/a/41347470/2308720
Oleksandr
102

Führen Sie das TextViewund das ImageViewzu einem zusammen, indem Sie die setCompoundDrawable*()Methoden von TextView verwenden oder verwenden android:drawableLeft.

Romain Guy
quelle
30
Könnten Sie mich auf ein Beispiel verweisen, das zeigt, wie das gemacht werden kann? Ich bin nicht sicher, wie alle Attribute in der ImageView in Android untergebracht werden können: drawableLeft. Vielen Dank
pdilip
1
Was ist mit ImageViews-Attributen wie scaleType?
Neteinstein
2
Wie vergrößere ich die Lücke zwischen Bild und Text?
TharakaNirmana
2
setCompoundDrawable * () funktioniert nicht, verwenden Sie stattdessen setCompoundDrawablesWithIntrinsicBounds ()
Kimo_do
1
@Kimo_do, kümmert setCompoundDrawable()sich nicht um Ihr Drawable, wie es ist, Sie müssen es aufrufen setBounds(siehe API ). Zum Festlegen können Sie die vorherigen Grenzen mit dem TextView.getCompoundDrawables()abrufen, auf den richtigen zeichnbaren Index zugreifen und schließlich aufrufen getBounds().
Avinash R
3

Manchmal ist es möglich , zu ersetzen ImageView(oder mehr) und TextViewmit einem TextViewmit der Verbindung drawable (s). Es gibt nicht viele Parameter , die angewendet werden können native API und diese zur Verbindung ziehbar mit TextViewRichDrawable Bibliothek , aber wenn Sie einen Textview verwalten kann anstelle von Linearlayout verwenden , sollten Sie es auf jeden Fall verwenden .

Die Liste der Attribute und Parameter, die auf zusammengesetzte Zeichen angewendet werden können:

Größe: ( JA, wirklich ):

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

Setzen Sie sogar die Vektorressource als zeichnbar:

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

Drawable's Padding mit nativer API android:drawablePadding-> Link

Hier ist ein Beispiel:

textView Rich Drawable

Oleksandr
quelle
2

A , LinearLayoutdie ein enthält ImageViewund eine TextViewkann effizienter als eine Verbindung drawable (eine einzelne behandelt werden TextViewunter Verwendung der drawableTop, drawableLeft, drawableRight und / oder drawableBottomAttribute ein oder mehrere Bilder neben dem Text zu ziehen).

Wenn die beiden Widgets durch Ränder voneinander versetzt sind, kann dies durch ein drawablePaddingAttribut ersetzt werden.

Es gibt einen Flusen-Quickfix, um diese Konvertierung im Eclipse-Plugin durchzuführen.

Von: Offizielle API-Dokumente für Android!

ilikyar
quelle
2

Hinzufügen tools:ignore="UseCompoundDrawables"zu <LinearLayout>.

CoolMind
quelle
1

Als ich den obigen Code befolgte, wurde der Text in der Textansicht nicht richtig eingestellt. Sie müssen die Schwerkraft auf zentrieren | starten, um das zu erreichen, was in der gestellten Frage gezeigt wird.

Die Textansicht sieht folgendermaßen aus:

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

Wenn Sie ImageView und TextView nicht ändern möchten, können Sie die Version in der Datei AndroidManifest.xml wie folgt ändern:

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

Wenn Ihre Version Android ist: targetSdkVersion = "17" ändern Sie es ist "18".

Hoffe das wird korrigiert. Ich habe es getan und es richtig gemacht

Dunken_sai
quelle
-2

Ein anderer Ansatz ist das Einbetten des ViewImage in ein anderes LinearLayout (erlauben Sie es, es mit einer alleinigen ID zu behandeln):

<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
quelle
Was wäre nun der Vorteil davon? Und warum setzen Sie den Namespace zweimal?
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
quelle