layout do Android: esta tag e seus filhos podem ser substituídos por um <TextView /> e um drawable composto

116

Quando executo o layout em um arquivo XML específico, obtenho o seguinte:

 This tag and its children can be replaced by one <TextView/> 
and a compound drawable

Que mudança deve ser feita para o seguinte código xml:

<LinearLayout android:id="@+id/name_layout"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:gravity="center_vertical"
                android:background="@drawable/grouplist_single_left_grey_area" >
                <ImageView android:id="@+id/photo_image"
                    android:layout_width="@dimen/thumbnail_width"
                    android:layout_height="@dimen/thumbnail_height"
                    android:paddingBottom="5dip"
                    android:paddingTop="5dip"
                    android:paddingRight="5dip"
                    android:paddingLeft="5dip"
                    android:layout_marginRight="5dip"
                    android:clickable="true"
                    android:focusable="true"
                    android:scaleType="fitCenter"
                    android:src="@*android:drawable/nopicture_thumbnail"
                    android:background="@drawable/photo_highlight" />
                <TextView android:id="@+id/name"
                    android:paddingLeft="5dip"
                    android:layout_weight="1"
                    android:layout_width="0dip"
                    android:layout_height="wrap_content"
                    android:gravity="center_vertical"
                    android:textAppearance="?android:attr/textAppearanceLarge" />
            </LinearLayout>

É assim que aparece na tela:

insira a descrição da imagem aqui

O ícone da câmera é o padrão. Clicar nele dará ao usuário a opção de escolher outra imagem.

pdilip
fonte
3
+1, porque essa situação parece mais complexa do que pode ser tratada por drawable composto. Se você não tivesse aceitado a resposta de Romain, poderia ter obtido uma resposta mais aprofundada.
AlbeyAmakiir

Respostas:

153

Para expandir a resposta de Romain Guy, aqui está um exemplo.

Antes:

<LinearLayout 
android:layout_width="fill_parent"
android:layout_height="wrap_content" 
android:layout_marginTop="10dp"  
android:padding="5dp" >

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:text="My Compound Button" />

<ImageView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/my_drawable" />
</LinearLayout>

Depois de:

<TextView  
    android:layout_marginTop="10dp"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content" 
    android:text="My Compound Button" 
    android:drawableRight="@drawable/my_drawable" android:padding="5dp" />
NPike
fonte
45
Nifty. Mas e se eu precisar definir propriedades no drawable, como definir 60dip x 60dip?
Kyle Clegg
4
Ei, olha só, tudo que eu tive que fazer foi pesquisar. stackoverflow.com/a/6671544/1224741
QED de
@KyleClegg, é possível com uma biblioteca personalizada. Veja minha resposta - stackoverflow.com/a/41347470/2308720
Oleksandr
102

Mesclar o TextViewe o ImageViewem um, usando os setCompoundDrawable*()métodos de TextView ou usando android:drawableLeft.

Romain Guy
fonte
30
Você poderia me apontar um exemplo que ilustre como isso pode ser feito? Não tenho certeza de como todos os atributos no ImageView podem ser acomodados no android: drawableLeft. Obrigado
pdilip de
1
E os atributos ImageViews como scaleType?
neteinstein
2
Como faço para aumentar a lacuna entre a imagem e o texto?
TharakaNirmana,
2
setCompoundDrawable * () não funciona, use setCompoundDrawablesWithIntrinsicBounds ()
Kimo_do
1
@Kimo_do, setCompoundDrawable()não cuidará de seu drawable como está, você deve chamá setBounds-lo (veja API ). Para configurá-lo, você pode obter os limites anteriores usando o TextView.getCompoundDrawables(), acessando o índice de drawable correto e finalmente chamando getBounds().
Avinash R
3

Às vezes é possível substituir ImageView(ou múltiplos) e TextViewcom um TextViewcom drawable (s) composto (s). NÃO há muitos parâmetros que podem ser aplicados ao drawable composto usando API nativa e esta biblioteca TextViewRichDrawable , mas se você pode gerenciar um TextView em vez de usar LinearLayout, você definitivamente deve usá-lo .

A lista de atributos e parâmetros que podem ser aplicados a drawables compostos:

Tamanho: ( SIM, realmente ):

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

Até mesmo defina o recurso vetorial como drawable:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Some text"
    app:drawableTopVector="@drawable/some_vector_drawble"
    app:drawableEndVector="@drawable/another_vector_drawable" />

Preenchimento do Drawable usando API nativa android:drawablePadding-> link

Aqui está um exemplo:

textView rich drawable

Oleksandr
fonte
2

Um LinearLayoutque contém um ImageViewe um TextViewpode ser mais eficientemente tratadas como um composto susceptível de ser estirado (uma única TextView, usando a drawableTop, drawableLeft, drawableRight e / ou drawableBottomos atributos para desenhar uma ou mais imagens adjacentes ao texto).

Se os dois widgets forem deslocados um do outro com margens, isso pode ser substituído por um drawablePaddingatributo.

Há uma correção rápida do lint para realizar essa conversão no plug-in Eclipse.

De: Documentos da API oficial do Android!

ilikyar
fonte
2

Adicionar tools:ignore="UseCompoundDrawables"a <LinearLayout>.

CoolMind
fonte
1

Quando segui o código acima, o texto dentro de TextView não foi definido corretamente. Você precisa definir sua gravidade para o centro | início para alcançar o que é mostrado na pergunta feita.

A visualização do texto é semelhante a esta:

   <TextView
        android:id="@+id/export_text"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:drawableLeft="@drawable/up_arrow"
        android:drawableStart="@drawable/up_arrow"
        android:gravity="center|start"
        android:text="....."
        android:textSize="@dimen/font_size15" >
    </TextView>
Vikas
fonte
0

Se não quiser alterar ImageView e TextView, você pode alterar a versão no AndroidManifest.xml como:

    <uses-sdk`
    android:minSdkVersion="8"
    android:targetSdkVersion="18" 
    />

Se sua versão for android: targetSdkVersion = "17" mude para "18".

Espero que isso seja corrigido. Eu fiz e acertei

Dunken_sai
fonte
-2

Outra abordagem é incorporar o ViewImage em outro LinearLayout (permitir manipulá-lo apenas com o id):

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <LinearLayout 
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >    
        <ImageView
            android:id="@+id/imageView1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/blue_3"
            android:layout_gravity="center_horizontal"
            android:paddingTop="16dp" />
    </LinearLayout>
    <TextView 
        android:id="@+id/tvPrompt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:paddingTop="16dp"
        android:text="@string/xy" />

Harvey Triana
fonte
Agora, qual seria a vantagem disso? E por que você está definindo o namespace duas vezes?
ygesher
-5
    This tag and its children can be replaced by one <TextView/> and a compound drawable



    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageview"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:focusable="false"
        android:contentDescription="."
        android:padding="3dp" 
        android:src="@drawable/tab_home_btn">
    </ImageView>

    <TextView
        android:id="@+id/textview"       
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" 
        android:text="首页"
        android:textSize="10sp"
        android:textColor="#ffffff">
    </TextView>

</LinearLayout>
andro_stackoverflow
fonte