Wie verwende ich ein zusammengesetztes Drawable anstelle eines LinearLayout, das eine ImageView und eine TextView enthält?

198

Lief das neue Lint-Tool gegen meinen Code. Es gab viele gute Vorschläge, aber diesen kann ich nicht verstehen.

Dieses Tag und seine untergeordneten Tags können durch ein und ein zusammengesetztes Zeichen ersetzt werden

Problem: Überprüft, ob der aktuelle Knoten mithilfe zusammengesetzter Zeichen durch eine Textansicht ersetzt werden kann.

Ein LinearLayout, das eine ImageView und eine TextView enthält, kann effizienter als zusammengesetztes Zeichenelement behandelt werden

Und hier ist mein Layout

<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_centerInParent="true">

<ImageView 
    android:id="@+id/upImage"
    android:layout_width="20dp"
    android:layout_height="20dp"
    android:layout_gravity="center_vertical"
    android:scaleType="centerInside"
    android:src="@drawable/up_count_big">
</ImageView>

<TextView
    android:id="@+id/LikeCount"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="2dp"
    android:layout_marginBottom="1dp"
    android:textColor="@color/gray"
    android:textSize="16sp"
    android:layout_gravity="center_vertical">
</TextView>
</LinearLayout>

Kann jemand ein konkretes Beispiel dafür geben, wie eine Verbindung in diesem Fall zeichnbar gemacht werden kann?

Löwe
quelle
4
fwiw das ist eine der Prüfungen, die ich normalerweise wegen der falsch positiven Ergebnisse deaktiviere. Nicht alle TextView/ ImageViewCombos können auf diese Weise ersetzt werden.
Richard Le Mesurier
@RichardLeMesurier Sie können die benutzerdefinierte Ansicht verwenden, wenn Sie eine Bildgröße definieren möchten. Dadurch wird Ihre Sicht heller. Siehe meine Antwort: stackoverflow.com/a/31916731/2308720
Oleksandr
@Alex Ich stimme in vielen Fällen zu, aber meiner Erfahrung nach lohnt es sich oft nicht, eine benutzerdefinierte Ansicht zu erstellen, um das zu umgehen, was ich für einen fehlerhaften Lint-Check halte.
Richard Le Mesurier

Antworten:

258

TextView kommt mit 4 zusammengesetzten Drawables, jeweils eine für links, oben, rechts und unten.

In Ihrem Fall brauchen Sie das LinearLayoutund ImageViewüberhaupt nicht. Fügen android:drawableLeft="@drawable/up_count_big"Sie einfach zu Ihrem TextView.

Weitere Informationen finden Sie unter TextView # setCompoundDrawablesWithIntrinsicBounds .

Chiuki
quelle
34
nicht unbedingt, da Ihr Link ein Beispiel mit einem dynamischen Bild zeigt. In diesem Fall kann es immer noch einfacher oder vorzuziehen sein, eine zu verwenden ImageView. Die Warnung lautet "kann ersetzt werden durch", nicht "sollte ersetzt werden durch"
David O'Meara
9
aber wie kann ich etwas Platz zwischen Bild und Text schaffen
Hitesh Dhamshaniya
7
@Hitesh Dhamshaniya, mit der DrawablePadding-Eigenschaft in XML oder Code.
Snicolas
2
In meinem Fall bin ich zu einem LinearLayout mit einer inneren ImageView / TextView gewechselt, weil das android: drawableLeft nicht genügend Kontrolle bot. Sie sagen mir also im Grunde, dass diese Warnung / dieser Vorschlag eine Lüge ist.
BrainSlugs83
5
Es ist keine Lüge, in einigen Fällen könnte eine einzelne Textansicht tatsächlich effizient sein. Aber im Allgemeinen - ja, ImageView mit TextView bietet eine viel umfassendere Steuerung.
ılǝ
20

Wenn Sie aus irgendeinem Grund einen Code hinzufügen müssen, können Sie Folgendes verwenden:

mTextView.setCompoundDrawablesWithIntrinsicBounds(left, top, right, bottom);

wo links, oben, rechts unten sind Drawables

Javier P.
quelle
Benötigen Sie API 17 oben
Puni
Ich glaube nicht, heißt es in der Dokumentation seit API 1
Javier P
Siehe diesen Link [Dokumentation] ( developer.android.com/reference/android/widget/… , android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable)
Puni
Ja, beachte den Verwandten im Methodennamen;) Ich beziehe mich nicht auf diesen in der Antwort
Javier P
1

Sie können die allgemeine zusammengesetzte Zeichnungsimplementierung verwenden. Wenn Sie jedoch eine Zeichnungsgröße definieren müssen, verwenden Sie diese Bibliothek:

https://github.com/a-tolstykh/textview-rich-drawable

Hier ist ein kleines Anwendungsbeispiel:

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