android layout: Цей тег та його діти можна замінити одним <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>

Ось як це виглядає на екрані:

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

Значок камери за замовчуванням. Натиснувши на це, користувач зможе вибрати інше зображення.


3
+1, оскільки ця ситуація виглядає складнішою, ніж її можна вирішити за допомогою складених даних. Якби ви не прийняли відповідь Ромена, ви могли б отримати більш глибоку відповідь.
AlbeyAmakiir

Відповіді:


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

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: dravableLeft. Дякую
pdilip

1
Що щодо атрибутів ImageViews, таких як scaleType?
neteinstein

2
Як збільшити розрив між зображенням і текстом?
TharakaNirmana

2
setCompoundDravable * () не працює, замість цього використовуйте setCompoundDrawablesWithIntrinsicBounds ()
Kimo_do

1
@Kimo_do, setCompoundDrawable()не піклується про те, як він є, вам потрібно зателефонувати setBounds(див. API ). Щоб встановити його, ви можете отримати попередні межі за допомогою TextView.getCompoundDrawables(), отримати доступ до правильного індексу, що виводиться, і нарешті зателефонувавши getBounds().
Авінаш Р

19

Думав, що я б спробував також отримати кілька додаткових пунто для цього: ви можете додати прокладки між зображенням і текстом, використовуючи android:drawablePadding. https://stackoverflow.com/a/6671544/1224741


3

Іноді можлива заміна ImageView(або кілька) та TextViewодна TextViewіз складених елементів, що малюються. НЕ МНОГО параметрів, які можна застосувати до складених файлів, що малюються за допомогою нативної API та цієї бібліотеки TextViewRichDravable , але якщо ви можете керувати одним 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" />

Draading's Padding за допомогою рідного API android:drawablePadding-> посилання

Ось приклад:

textView багатими для малювання


2

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

Якщо два віджети зміщені один від одного з полями, це може бути замінено drawablePaddingатрибутом.

Існує швидке виправлення для виконання цього перетворення в плагіні Eclipse.

Від: Офіційні документи API для Android!



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

Сподіваюся, це виправить. Я це зробив і правильно зрозумів


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


Тепер у чому б це було перевагою? І чому ви встановлюєте простір імен двічі?
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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.