How do I use a compound drawable instead of a LinearLayout that contains an ImageView and a TextView
Asked Answered
A

4

220

Ran the new Lint tool against my code. It came up with a lot of good suggestions, but this one I cannot understand.

This tag and its children can be replaced by one and a compound drawable

Issue: Checks whether the current node can be replaced by a TextView using compound drawables.

A LinearLayout which contains an ImageView and a TextView can be more efficiently handled as a compound drawable

And here is my 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>

Can someone provide a concrete example of how to make a compound drawable in this case?

Arteritis answered 29/11, 2011 at 22:39 Comment(3)
fwiw that's one of the checks I normally disable, because of the false positives. Not all TextView / ImageView combos can be replaced in this way.Hepner
@RichardLeMesurier You can use custom view if you want to define a size of image. This will make your view lighter. See my answer: https://mcmap.net/q/120656/-compounddrawable-sizeCohort
@Alex I agree in many cases, however in my experience I have often it not worth the trouble of creating a custom view to get around what I consider to be a buggy Lint check.Hepner
E
287

TextView comes with 4 compound drawables, one for each of left, top, right and bottom.

In your case, you do not need the LinearLayout and ImageView at all. Just add android:drawableLeft="@drawable/up_count_big" to your TextView.

See TextView#setCompoundDrawablesWithIntrinsicBounds for more info.

Erythroblastosis answered 29/11, 2011 at 23:20 Comment(8)
not necessarily, as your link shows an example with a dynamic image. In that case it may still be easier or preferable to use an ImageView. The warning says 'can be replaced by', not 'should be replaced by'Caballero
but how can I make some space between Image and TextStinko
@Hitesh Dhamshaniya, using DrawablePadding property in XML or code.Chinkapin
and you can also link TextView drawables to xml states, explained here: 2cupsoftech.wordpress.com/2012/09/18/…Halfbreed
In my case, I moved to a LinearLayout with an inner ImageView/TextView because the android:drawableLeft didn't offer enough control -- so, what you're basically telling me is that this warning/suggestion is a lie.Pressmark
It's not a lie, for some cases a single TextView could indeed be efficient. But in general - yes, ImageView with TextView provides much richer control.Seaborne
And how do you apply tinting to the compound drawables? I need that option?Vacuity
@Puni, do you use SVG images? If yes, you should add a support.Febri
M
25

if for some reason you need to add via code, you can use this:

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

where left, top, right bottom are Drawables

Macula answered 11/12, 2013 at 14:32 Comment(4)
Require API 17 aboveCrissy
I don't think so, documentation states since API 1Macula
See this link [documentation](developer.android.com/reference/android/widget/…, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable, android.graphics.drawable.Drawable))Crissy
yeah note the Relative in the method name ;) I'm not referring to this one in the answerMacula
H
3

To add to this - it seems important to define the width & height of the drawable as per this post:

(his code works)

Hepner answered 22/11, 2012 at 10:5 Comment(0)
C
1

You can use general compound drawable implementation, but if you need to define a size of drawable use this library:

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

Here is a small example of usage:

<com.tolstykh.textviewrichdrawable.TextViewRichDrawable
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Some text"
        app:compoundDrawableHeight="24dp"
        app:compoundDrawableWidth="24dp" />
Cohort answered 27/12, 2016 at 14:33 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.