以编程方式在 TextView 中设置左可绘制对象
Posted
技术标签:
【中文标题】以编程方式在 TextView 中设置左可绘制对象【英文标题】:Programmatically set left drawable in a TextView 【发布时间】:2011-10-19 09:38:18 【问题描述】:我在这里有一个 xml 格式的 textView。
<TextView
android:id="@+id/bookTitle"
android:layout_
android:layout_
android:layout_weight="1"
android:drawableLeft="@drawable/checkmark"
android:gravity="center_vertical"
android:textStyle="bold"
android:textSize="24dip"
android:maxLines="1"
android:ellipsize="end"/>
如您所见,我在 xml 中设置了 DrawableLeft。
我想更改代码中的可绘制对象。
有没有办法去做这件事?还是在代码中为文本视图设置 drawableLeft?
【问题讨论】:
【参考方案1】:您可以使用setCompoundDrawablesWithIntrinsicBounds(int left, int top, int right, int bottom)
在不需要图片的地方设置 0
左侧 Drawable 示例:
TextView textView = (TextView) findViewById(R.id.myTxtView);
textView.setCompoundDrawablesWithIntrinsicBounds(R.drawable.icon, 0, 0, 0);
或者,您可以使用 setCompoundDrawablesRelativeWithIntrinsicBounds 来尊重 RTL/LTR 布局。
提示:只要您知道任何 XML 属性但不知道如何在运行时使用它。只需转到开发人员文档中该属性的描述即可。如果在运行时支持,您将在那里找到 相关方法。即For DrawableLeft
【讨论】:
那么在这个方法中我应该在哪里设置drawable呢? +1 它用于以编程方式为 TextView 设置 android:drawableLeft。谢谢队友 +1 用于添加小费。这应该是开发人员在使用文档时被告知的第一件事 @BrainCrash 你说得对,我把它误认为是同名的新方法。 您好,我正在使用这种方法来设置可绘制对象,但我找不到它的 getter 对应部分。我必须检查复合文本视图是否有一些可绘制的。我怎么做?尝试将textview.getCompoundDrawablesRelative()[0]
与mContext.getResources().getDrawable(R.drawable.my_drawable)
进行比较【参考方案2】:
从here我看到setCompoundDrawablesWithIntrinsicBounds(int,int,int,int)的方法可以做到这一点。
【讨论】:
【参考方案3】:使用 Kotlin:
你可以创建一个扩展函数或者直接使用setCompoundDrawablesWithIntrinsicBounds
。
fun TextView.leftDrawable(@DrawableRes id: Int = 0)
this.setCompoundDrawablesWithIntrinsicBounds(id, 0, 0, 0)
如果需要调整drawable的大小,可以使用这个扩展功能。
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)
要真正花哨,请创建一个允许修改大小和/或颜色的包装器。
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)
【讨论】:
【参考方案4】:您可以使用以下任何一种方法在 TextView 上设置 Drawable:
1-setCompoundDrawablesWithIntrinsicBounds(int, int, int, int)
2-setCompoundDrawables(Left_Drawable, Top_Drawable, Right_Drawable, Bottom_Drawable)
并且要从您可以使用的资源中获取可绘制性:
getResources().getDrawable(R.drawable.your_drawable_id);
【讨论】:
不,setCompoundDrawablesWithIntrinsicBounds(int, int, int, int) 是来自您自己的链接的 API Levet 3...【参考方案5】:Kotlin 扩展 + 可绘制对象周围的一些填充
fun TextView.addDrawable(drawable: Int)
val imgDrawable = ContextCompat.getDrawable(context, drawable)
compoundDrawablePadding = 32
setCompoundDrawablesWithIntrinsicBounds(imgDrawable, null, null, null)
【讨论】:
【参考方案6】:有两种方法可以使用 XML 或 Java。 如果它是静态的并且不需要更改,那么您可以在 XML 中进行初始化。
android:drawableLeft="@drawable/cloud_up"
android:drawablePadding="5sp"
现在,如果您需要动态更改图标,那么您可以通过 根据事件调用图标
textViewContext.setText("File Uploaded");
textViewContext.setCompoundDrawablesWithIntrinsicBounds(R.drawable.uploaded, 0, 0, 0);
【讨论】:
【参考方案7】:我可以改变文本视图左/右可绘制颜色
for (drawable in binding.tvBloodPressure.compoundDrawablesRelative)
if (drawable != null)
drawable.colorFilter = PorterDuffColorFilter(
ContextCompat.getColor(binding.tvBloodPressure.context, color),
PorterDuff.Mode.SRC_IN
)
【讨论】:
【参考方案8】:我就是这样用的。
txtUserName.setCompoundDrawablesWithIntrinsicBounds(
requireActivity().getDrawable(
R.drawable.ic_my_account
), null, null, null
)
【讨论】:
【参考方案9】:static private Drawable **scaleDrawable**(Drawable drawable, int width, int height)
int wi = drawable.getIntrinsicWidth();
int hi = drawable.getIntrinsicHeight();
int dimDiff = Math.abs(wi - width) - Math.abs(hi - height);
float scale = (dimDiff > 0) ? width / (float)wi : height /
(float)hi;
Rect bounds = new Rect(0, 0, (int)(scale * wi), (int)(scale * hi));
drawable.setBounds(bounds);
return drawable;
【讨论】:
这没有回答问题。预计与 TextView 相关的答案。以上是关于以编程方式在 TextView 中设置左可绘制对象的主要内容,如果未能解决你的问题,请参考以下文章