我想在当前项目的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
中的图片将从后端服务器中检索,可能不适合以静态方式设置。
答案 0 :(得分:1)
将图像插入可绘制图层时,不会刷新视图。这就是为什么它看起来像以前一样。
我猜这不是一个好方法。想要更新图像时,最好使用此功能。
当要更新时,使用此行代码进行更新。
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)
}