Come posso usare un disegno estraibile composto invece di un LinearLayout che contiene un ImageView e un TextView


198

Ho usato il nuovo strumento Lint contro il mio codice. È venuto fuori con molti buoni suggerimenti, ma questo non riesco a capire.

Questo tag e i suoi figli possono essere sostituiti da uno e da un disegno estraibile

Problema: verifica se il nodo corrente può essere sostituito da un oggetto TextView utilizzando drawable composti.

Un LinearLayout che contiene ImageView e TextView può essere gestito in modo più efficiente come un disegno composto

Ed ecco il mio 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>

Qualcuno può fornire un esempio concreto di come rendere un composto estraibile in questo caso?


4
prima è uno dei controlli che disabilito normalmente, a causa dei falsi positivi. Non tutte le TextView/ ImageViewcombo possono essere sostituite in questo modo.
Richard Le Mesurier,

@RichardLeMesurier È possibile utilizzare la vista personalizzata se si desidera definire una dimensione dell'immagine. Questo renderà la tua vista più chiara. Vedi la mia risposta: stackoverflow.com/a/31916731/2308720
Oleksandr

@Alex Sono d'accordo in molti casi, tuttavia nella mia esperienza spesso non vale la pena creare una vista personalizzata per aggirare quello che considero un controllo Lint difettoso.
Richard Le Mesurier,

Risposte:


258

TextView viene fornito con 4 drawable composti, uno per ciascuno di sinistra, in alto, a destra e in basso.

Nel tuo caso, non hai bisogno del LinearLayoute ImageViewaffatto. Aggiungi android:drawableLeft="@drawable/up_count_big"al tuo TextView.

Vedi TextView # setCompoundDrawablesWithIntrinsicBounds per maggiori informazioni.


34
non necessariamente, poiché il tuo link mostra un esempio con un'immagine dinamica. In tal caso potrebbe essere ancora più semplice o preferibile utilizzare un ImageView. L'avvertimento dice "può essere sostituito da", non "deve essere sostituito da"
David O'Meara,

9
ma come posso fare un po 'di spazio tra immagine e testo
Hitesh Dhamshaniya il

7
@Hitesh Dhamshaniya, usando la proprietà DrawablePadding in XML o codice.
Snicolas,

2
Nel mio caso, mi sono trasferito in un LinearLayout con un interno ImageView / TextView perché l'androide: drawableLeft non offriva abbastanza controllo - quindi, quello che mi stai sostanzialmente dicendo è che questo avviso / suggerimento è una bugia.
BrainSlugs83

5
Non è una bugia, per alcuni casi un singolo TextView potrebbe effettivamente essere efficiente. Ma in generale - sì, ImageView con TextView offre un controllo molto più ricco.
ılǝ

20

se per qualche motivo è necessario aggiungere tramite codice, è possibile utilizzare questo:

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

dove sinistra, in alto, in basso a destra sono i Drawable


Richiedi API 17 sopra
Puni

Non credo, la documentazione afferma da API 1
Javier P

Vedi questo link [documentazione] ( developer.android.com/reference/android/widget/… , android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))
Puni

si noti il parente nel nome del metodo;) Non mi riferisco a questo nella risposta
Javier P


1

È possibile utilizzare un'implementazione di disegno composto generale, ma se è necessario definire una dimensione di disegno utilizza questa libreria:

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

Ecco un piccolo esempio di utilizzo:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        app:compoundDrawableHeight="24dp"
        app:compoundDrawableWidth="24dp" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.