以编程方式在 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 中设置左可绘制对象的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式在TextView中设置文本对齐方式

使用复合可绘制对象在 TextView 中设置实际文本填充

如何在 TextView 中将文本与其复合可绘制对象对齐?

如何以编程方式制作可绘制的形状(Android)

无法在导航栏中设置左栏按钮项?

图层列表可绘制对象有时未完全呈现