setDrawableByLayerId不适用于透明的默认drawable

时间:2019-09-03 06:03:33

标签: android kotlin

我想在当前项目的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>

我对图标的期望是(请忽略文本): enter image description here

但实际上它显示: enter image description here

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"/>

enter image description here

layer-list中的图片将从后端服务器中检索,可能不适合以静态方式设置。

2 个答案:

答案 0 :(得分:1)

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

我猜这不是一个好方法。想要更新图像时,最好使用此功能。

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

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

答案 1 :(得分:1)

在创建新的可绘制对象之后,您在这里犯了一个错误,您没有将其应用到按钮中。

setCompoundDrawablesWithIntrinsicBounds()

在创建新的drawable并将新的drawable设置到按钮中之后,此函数仅接受drawable或resource int作为其参数,但是这种方法在这种情况下效果不佳。

要获得所需的内容,只需要稍微修改一下start_icon_drawable_dyn.xml文件即可。

<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="@drawable/iR.drawable.bodhi"/>

只需更改

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

对此

<item android:id="@+id/drawPic1"
        android:drawable="@drawable/iR.drawable.bodhi"/>

已更新 至于动态图像,请添加它。

drawBtn.setCompoundDrawablesWithIntrinsicBounds( layerDrawable, null, null, null)

创建新图像后。

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))
drawBtn.setCompoundDrawablesWithIntrinsicBounds( layerDrawable, null, null, null)
}