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?


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.


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


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" />
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.