'Programmatically set left drawable in a TextView
I have a textView in xml here.
<TextView
android:id="@+id/bookTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:drawableLeft="@drawable/checkmark"
android:gravity="center_vertical"
android:textStyle="bold"
android:textSize="24dip"
android:maxLines="1"
android:ellipsize="end"/>
As you can see I set the DrawableLeft in xml.
I would like to change the drawable in code.
Is there anyway to go about doing this? Or setting the drawableLeft in code for the text view?
Solution 1:[1]
From here I see the method setCompoundDrawablesWithIntrinsicBounds(int,int,int,int) can be used to do this.
Solution 2:[2]
Using Kotlin:
You can create an extension function or just use setCompoundDrawablesWithIntrinsicBounds directly.
fun TextView.leftDrawable(@DrawableRes id: Int = 0) {
this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
}
If you need to resize the drawable, you can use this extension function.
textView.leftDrawable(R.drawable.my_icon, R.dimen.icon_size)
fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int) {
val drawable = ContextCompat.getDrawable(context, id)
val size = resources.getDimensionPixelSize(sizeRes)
drawable?.setBounds(0, 0, size, size)
this.setCompoundDrawables(drawable, null, null, null)
}
To get really fancy, create a wrapper that allows size and/or color modification.
textView.leftDrawable(R.drawable.my_icon, colorRes = R.color.white)
fun TextView.leftDrawable(@DrawableRes id: Int = 0, @DimenRes sizeRes: Int = 0, @ColorInt color: Int = 0, @ColorRes colorRes: Int = 0) {
val drawable = drawable(id)
if (sizeRes != 0) {
val size = resources.getDimensionPixelSize(sizeRes)
drawable?.setBounds(0, 0, size, size)
}
if (color != 0) {
drawable?.setColorFilter(color, PorterDuff.Mode.SRC_ATOP)
} else if (colorRes != 0) {
val colorInt = ContextCompat.getColor(context, colorRes)
drawable?.setColorFilter(colorInt, PorterDuff.Mode.SRC_ATOP)
}
this.setCompoundDrawables(drawable, null, null, null)
}
Solution 3:[3]
You can use any of the following methods for setting the Drawable on TextView:
1- setCompoundDrawablesWithIntrinsicBounds(int, int, int, int)
2- setCompoundDrawables(Left_Drawable, Top_Drawable, Right_Drawable, Bottom_Drawable)
And to get drawable from resources you can use:
getResources().getDrawable(R.drawable.your_drawable_id);
Solution 4:[4]
A Kotlin extension + some padding around the drawable
fun TextView.addLeftDrawable(drawable: Int, padding: Int = 32) {
val imgDrawable = ContextCompat.getDrawable(context, drawable)
compoundDrawablePadding = padding
setCompoundDrawablesWithIntrinsicBounds(imgDrawable, null, null, null)
}
Solution 5:[5]
there are two ways of doing it either you can use XML or Java for it. If it's static and requires no changes then you can initialize in XML.
android:drawableLeft="@drawable/cloud_up"
android:drawablePadding="5sp"
Now if you need to change the icons dynamically then you can do it by calling the icons based on the events
textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);
Solution 6:[6]
Works for me to change the text view left/right drawable color
for (drawable in binding.tvBloodPressure.compoundDrawablesRelative) {
if (drawable != null) {
drawable.colorFilter = PorterDuffColorFilter(
ContextCompat.getColor(binding.tvBloodPressure.context, color),
PorterDuff.Mode.SRC_IN
)
}
}
Solution 7:[7]
I am using like this.
txtUserName.setCompoundDrawablesWithIntrinsicBounds(
requireActivity().getDrawable(
R.drawable.ic_my_account
), null, null, null
)
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Jack |
| Solution 2 | |
| Solution 3 | |
| Solution 4 | Kamal |
| Solution 5 | Ayan Bhattacharjee |
| Solution 6 | Mohsin Iqbal |
| Solution 7 | Peter |
