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.