Como usar um drawable composto em vez de um LinearLayout que contém um ImageView e um TextView

198

Executei a nova ferramenta Lint no meu código. Ele veio com muitas sugestões boas, mas essa eu não consigo entender.

Esta tag e seus filhos podem ser substituídos por um e um drawable composto

Problema: verifica se o nó atual pode ser substituído por um TextView usando drawables compostos.

Um LinearLayout que contém um ImageView e um TextView pode ser tratado com mais eficiência como um drawable composto

E aqui está o meu 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>

Alguém pode fornecer um exemplo concreto de como tornar um composto extraível nesse caso?

Leo
fonte
4
fwiw é uma das verificações que normalmente desativo, devido aos falsos positivos. Nem todos os TextView/ ImageViewcombos podem ser substituídos desta forma.
Richard Le Mesurier 5/05
@RichardLeMesurier Você pode usar a visualização personalizada se desejar definir um tamanho de imagem. Isso tornará sua visão mais clara. Veja minha resposta: stackoverflow.com/a/31916731/2308720
Oleksandr
@ Alex Eu concordo em muitos casos, no entanto, na minha experiência, muitas vezes não vale a pena criar uma exibição personalizada para contornar o que considero uma verificação de bugs com defeito.
Richard Le Mesurier

Respostas:

258

TextView vem com 4 drawables compostos, um para cada um dos lados esquerdo, superior, direito e inferior.

No seu caso, você não precisa do LinearLayoute ImageViewem tudo. Basta adicionar android:drawableLeft="@drawable/up_count_big"ao seu TextView.

Consulte TextView # setCompoundDrawablesWithIntrinsicBounds para obter mais informações.

chiuki
fonte
34
não necessariamente, pois seu link mostra um exemplo com uma imagem dinâmica. Nesse caso, ainda pode ser mais fácil ou preferível usar um ImageView. O aviso diz 'pode ser substituído por', não 'deve ser substituído por'
David O'Meara
9
mas como eu posso fazer algum espaço entre imagem e texto
Hitesh Dhamshaniya
7
@Hitesh Dhamshaniya, usando a propriedade DrawablePadding em XML ou código.
Snicolas
2
No meu caso, mudei para um LinearLayout com um ImageView / TextView interno porque o android: drawableLeft não ofereceu controle suficiente - então, o que você está basicamente me dizendo é que esse aviso / sugestão é uma mentira.
BrainSlugs83
5
Não é mentira, em alguns casos um único TextView pode ser realmente eficiente. Mas, em geral - sim, o ImageView com TextView fornece um controle muito mais rico.
ılǝ
20

se, por algum motivo, você precisar adicionar via código, poderá usar isso:

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

onde esquerdo, superior e inferior direito são Drawables

Javier P
fonte
Requer API 17 acima
Puni
Eu não penso assim, documentação Unidos desde API 1
Javier P
Consulte este link [documentação] ( developer.android.com/reference/android/widget/… , android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable)
Puni
sim observar o Relativa no nome do método;) Eu não estou me referindo a este na resposta
Javier P
1

Você pode usar a implementação geral do drawable composto, mas se precisar definir um tamanho do drawable, use esta biblioteca:

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

Aqui está um pequeno exemplo de uso:

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