макет android: этот тег и его дочерние элементы могут быть заменены одним <TextView /> и составным рисунком

116

Когда я запускаю макет для определенного XML-файла, я получаю следующее:

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

Какие изменения нужно сделать для следующего 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>

Вот как это выглядит на экране:

введите описание изображения здесь

Значок камеры установлен по умолчанию. Щелчок по нему даст пользователю возможность выбрать другое изображение.

pdilip
источник
3
+1, потому что эта ситуация выглядит более сложной, чем может быть обработано составным drawable. Если бы вы не приняли ответ Ромена, вы могли бы получить более подробный ответ.
AlbeyAmakiir 07

Ответы:

153

Чтобы расширить ответ Ромена Гая, вот пример.

Перед:

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

После:

<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
источник
45
Острота. Но что, если мне нужно установить свойства на чертеже, например, определить его как 60dip x 60dip?
Кайл Клегг
4
Эй, посмотри на это, все, что мне нужно было сделать, это поискать. stackoverflow.com/a/6671544/1224741
QED
@KyleClegg, можно с кастомной библиотекой. См. Мой ответ - stackoverflow.com/a/41347470/2308720
Александр,
102

Объедините TextViewи ImageViewв один, используя setCompoundDrawable*()методы TextView или используя android:drawableLeft.

Ромен Гай
источник
30
Не могли бы вы указать мне на пример, показывающий, как это можно сделать? Я не уверен, как все атрибуты в ImageView могут быть размещены в android: drawableLeft. Спасибо
pdilip 09
1
А как насчет атрибутов ImageViews, таких как scaleType?
neteinstein
2
Как увеличить разрыв между изображением и текстом?
TharakaNirmana
2
setCompoundDrawable * () не работает, используйте вместо этого setCompoundDrawablesWithIntrinsicBounds ()
Kimo_do
1
@Kimo_do, setCompoundDrawable()не позаботится о вашем рисовании как таковом, вы должны его вызвать setBounds(см. API ). Для его установки вы можете получить предыдущие границы с помощью TextView.getCompoundDrawables(), получив доступ к правильному отображаемому индексу и, наконец, вызвав getBounds().
Avinash R
19

Подумал, что я бы попытался получить для этого дополнительные пунто: вы можете добавить отступ между изображением и текстом, используя android:drawablePadding. https://stackoverflow.com/a/6671544/1224741

QED
источник
3

Иногда можно заменить ImageView(или несколько) и TextViewна один TextViewс составными вытяжками. Существует НЕ много параметров, которые можно применить к составному рисунку с использованием собственного API и этой библиотеки TextViewRichDrawable , но если вы можете управлять одним TextView вместо использования LinearLayout, вы обязательно должны его использовать. .

Список атрибутов и параметров, которые можно применять к составным чертежам:

Размер: ( ДА, правда ):

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

Даже установите векторный ресурс как доступный для рисования:

<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" />

Заполнение Drawable с использованием собственного API android:drawablePadding-> ссылка

Вот пример:

textView с богатым рисованием

Александр
источник
2

LinearLayout, Который содержит ImageViewи TextViewможет быть более эффективно обрабатываться как соединение Drawable (один TextView, используя drawableTop, drawableLeft, drawableRight и / или drawableBottomатрибуты , чтобы сделать одно или несколько изображений , прилегающих к тексту).

Если два виджета смещены друг относительно друга с полями, это можно заменить drawablePaddingатрибутом.

Для выполнения этого преобразования в подключаемом модуле Eclipse есть lint quickfix.

От: Официальные документы API Android!

Иликьяр
источник
2

Добавить tools:ignore="UseCompoundDrawables"в <LinearLayout>.

CoolMind
источник
1

Когда я последовал приведенному выше коду, текст внутри TextView не установлен должным образом. Вам нужно установить его гравитацию в центр | начать, чтобы достичь того, что показано в заданном вопросе.

Текстовое представление выглядит так:

   <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>
Викас
источник
0

Если вы не хотите изменять ImageView и TextView, вы можете изменить версию в AndroidManifest.xml как:

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

Если ваша версия - android: targetSdkVersion = "17", измените ее на "18".

Надеюсь, это исправит. Я сделал это и понял

Dunken_sai
источник
-2

Другой подход - встроить ViewImage в другой LinearLayout (разрешить обрабатывать его только с идентификатором):

<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" />

Харви Триана
источник
Какая в этом польза? И почему вы устанавливаете пространство имен дважды?
ыгешер
-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
источник