Calling setCompoundDrawables() doesn't display the Compound Drawable

Viewed 89195

After I call the setCompoundDrawables method, the compound Drawable is not shown..

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn.setCompoundDrawables(myDrawable, null, null, null);

Any thoughts?

11 Answers

The Image is not shown as you didn't specify the bounds, so you have 2 options here.

1st Method

Use setCompoundDrawablesWithIntrinsicBounds method, as shown below

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
btn. setCompoundDrawablesWithIntrinsicBounds(myDrawable, null, null, null);

2nd Method

You can apply bounds to the drawable before applying to the TextView, as shown below

Drawable myDrawable = getResources().getDrawable(R.drawable.btn);
myDrawable.setBounds( 0, 0, myDrawable.getIntrinsicWidth(), myDrawable.getIntrinsicHeight());
btn.setCompoundDrawables(myDrawable, null, null, null);

That's it.

In Kotlin:

1) Set drawable:

val drawable = ContextCompat.getDrawable(context!!,R.drawable.ic_image)?.apply {
    setBounds(0, 0, intrinsicWidth, intrinsicHeight)
}

or

val drawable = ResourcesCompat.getDrawable(resources, R.drawable.ic_image, null)?.apply {
    setBounds(0, 0, minimumWidth, minimumHeight)
}

2) Set TextView:

textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null, null, null)

or

button.setCompoundDrawables(null, drawable, null, null)

Example with Kotlin:

    val myView = layoutInflater.inflate(R.layout.my_view, null) as TextView
    myView.setCompoundDrawablesWithIntrinsicBounds(0, myDrawable, 0, 0)

In Kotlin with Databinding

binding.tvTime.setCompoundDrawablesWithIntrinsicBounds(
            ResourcesCompat.getDrawable(resources, android.R.drawable.ic_menu_recent_history, null),
            null,null,null)

where tvTime is textView and Position (Rigth,Top,Left,Bottom), More about binding is here https://stackoverflow.com/a/72360048/12272687

Related