首页 > 解决方案 > setDrawableByLayerId 不适用于透明的默认可绘制对象

问题描述

我想在layer-list当前项目中动态设置可绘制图片。我做了如下的最小测试用例。

对于活动,它只是一个onCreate函数:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.btn_draw_activity_dyn)

    val drawBtn = findViewById<Button>(R.id.draw_btn)
    drawBtn.setOnClickListener {
        Toast.makeText(this@MainActivity, "Gotta you", Toast.LENGTH_LONG).show()
    }

    val layerDrawable = resources.getDrawable(R.drawable.start_icon_drawable_dyn) as LayerDrawable
    layerDrawable.setDrawableByLayerId(R.id.drawPic1, ContextCompat.getDrawable(this@MainActivity, R.drawable.bodhi))
}

布局xml文件(btn_draw_activity_dyn.xml)只是一个<Button>,我需要设置drawableStart

<Button
        android:id="@+id/draw_btn"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Dynamic Button"
        android:drawableStart="@drawable/start_icon_drawable_dyn"
        />

最后是start_icon_drawable_dyn.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item>
        <shape android:shape="oval">
            <solid android:color="@android:color/transparent" />
            <stroke
                    android:width="3dp"
                    android:color="@android:color/white" />
            <size
                    android:width="40dp"
                    android:height="40dp" />
        </shape>
    </item>

    <item android:id="@+id/drawPic1"
            android:drawable="@android:color/transparent"/>
</layer-list>

我对图标的期望是(请忽略文字): 在此处输入图像描述

但实际上它显示: 在此处输入图像描述

PS:在使用setCompoundDrawablesWithIntrinsicBounds时,我需要layer-list稍后将其更新为几个项目,例如:

<item android:id="@+id/drawPic1"
        android:drawable="@android:color/transparent"/>

<item android:id="@+id/drawSun"
        android:drawable="@android:color/transparent"
        android:gravity="end"
        android:height="15dp"
        android:width="15dp"/>

在此处输入图像描述

而且里面的图片layer-list会从后端服务器获取,可能不适合静态设置。

标签: androidkotlin

解决方案


当您将图像插入可绘制图层时,它不会刷新视图。这就是为什么它看起来像以前一样。

我猜这不是一个好方法。当您想要更新图像时,最好使用它。

  1. 制作 2 个持久文件。一个带有椭圆形,一个带有图像。
  2. 当想要更新它时,使用这行代码进行更新。

    view.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_checked, 0, 0, 0);


推荐阅读