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.


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

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.


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


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!


2

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


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>

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


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


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>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.