Как использовать составной объект рисования вместо LinearLayout, который содержит ImageView и TextView


198

Запустил новый инструмент Lint для моего кода. Было много хороших предложений, но я этого не понимаю.

Этот тег и его дочерние элементы могут быть заменены одним и составным рисунком

Проблема: проверяет, можно ли заменить текущий узел на TextView, используя составные элементы рисования.

LinearLayout, который содержит ImageView и TextView, может быть более эффективно обработан как составной чертеж

А вот и мой макет

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

Может ли кто-нибудь привести конкретный пример того, как сделать составной элемент в этом случае пригодным для рисования?


4
Это одна из проверок, которую я обычно отключаю из-за ложных срабатываний. Не все TextView/ ImageViewкомбо могут быть заменены таким образом.
Ричард Ле Мезурье

@RichardLeMesurier Вы можете использовать пользовательский вид, если хотите определить размер изображения. Это сделает ваш взгляд светлее. Смотрите мой ответ: stackoverflow.com/a/31916731/2308720
Александр

@ Алекс Я согласен во многих случаях, однако, по моему опыту, я часто не стоил усилий по созданию пользовательского представления, чтобы обойти то, что я считаю ошибочной проверкой Lint.
Ричард Ле Мезурье

Ответы:


258

TextView поставляется с 4 составными чертежами, по одному для каждого слева, сверху, справа и снизу.

В твоем случае тебе и не нужно LinearLayoutи ImageViewвообще. Просто добавь android:drawableLeft="@drawable/up_count_big"в свой TextView.

Посмотрите TextView # setCompoundDrawablesWithIntrinsicBounds для получения дополнительной информации.


34
не обязательно, так как ваша ссылка показывает пример с динамическим изображением. В этом случае все еще может быть проще или предпочтительнее использовать ImageView. Предупреждение гласит: «может быть заменено», а не «должно быть заменено»
Дэвид О'Мира

9
но как я могу сделать некоторое пространство между изображением и текстом
Хитеш Дхамшания

7
@Hitesh Dhamshaniya, используя свойство DrawablePadding в XML или коде.
Сниколас

2
В моем случае я перешел к LinearLayout с внутренним ImageView / TextView, потому что android: drawableLeft не предлагал достаточного контроля - так что вы в основном говорите мне, что это предупреждение / предложение - ложь.
BrainSlugs83

5
Это не ложь, в некоторых случаях один TextView действительно может быть эффективным. Но в целом - да, ImageView с TextView обеспечивает гораздо более богатый контроль.
Ил

20

если по какой-то причине вам нужно добавить через код, вы можете использовать это:

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

где слева, сверху, справа внизу - Drawables


Требуется API 17 выше
Puni

Я так не думаю, документация утверждает, что с API 1
Хавьер P

См. Эту ссылку [документация] ( developer.android.com/reference/android/widget/… , android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))
Пуни,

да, обратите внимание на родственника в названии метода;) Я не говорю об этом в ответе
Хавьер Р


1

Вы можете использовать общую составную реализацию drawable, но если вам нужно определить размер drawable, используйте эту библиотеку:

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

Вот небольшой пример использования:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        app:compoundDrawableHeight="24dp"
        app:compoundDrawableWidth="24dp" />
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.