如何在Kotlin代码中通过资源ID获取Drawable内元素并设置点击事件
在Kotlin的Activity中处理Drawable XML里元素的点击事件
你遇到的问题核心是——Drawable资源中的findViewById是用来查找布局文件(layout目录下)里的View组件的,getDrawable只是获取整个Drawable对象,自然没法直接拿到里面的
场景1:Drawable作为某个View的背景/前景使用
如果你把@drawable/delete_bg设置给了ImageView、Button这类View,直接给承载它的View设置点击事件即可:
// 找到承载该Drawable的View(示例为ImageView,替换成你实际使用的View类型和id) val deleteContainer = findViewById<ImageView>(R.id.your_view_id) deleteContainer.setOnClickListener { // 这里编写点击后的逻辑 Toast.makeText(this, "删除按钮被点击", Toast.LENGTH_SHORT).show() }
场景2:需要让Drawable内的特定- 区域单独响应点击
如果你的Drawable是layer-list这类多层结构,只想让delete_btn对应的区域触发点击,需要通过自定义View来处理触摸事件:
步骤1:编写自定义View类
class ClickableLayerView(context: Context, attrs: AttributeSet?) : View(context, attrs) { private var layerDrawable: LayerDrawable? = null private val deleteBtnBounds = Rect() init { // 获取View的背景Drawable(假设你把delete_bg设为该View的背景) background?.takeIf { it is LayerDrawable }?.let { layerDrawable = it as LayerDrawable // 根据id找到目标item,复制它的边界信息 layerDrawable?.findDrawableByLayerId(R.id.delete_btn)?.copyBounds(deleteBtnBounds) } } override fun onTouchEvent(event: MotionEvent): Boolean { when (event.action) { MotionEvent.ACTION_UP -> { // 判断点击坐标是否落在delete_btn的区域内 if (deleteBtnBounds.contains(event.x.toInt(), event.y.toInt())) { performClick() return true } } } return super.onTouchEvent(event) } override fun performClick(): Boolean { super.performClick() // 这里编写点击delete_btn区域后的逻辑 Toast.makeText(context, "Drawable内的删除区域被点击", Toast.LENGTH_SHORT).show() return true } }
步骤2:在布局中使用自定义View
<com.yourpackage.ClickableLayerView android:id="@+id/custom_layer_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@drawable/delete_bg" />
步骤3:在Activity中关联(可选)
如果需要在Activity中统一处理点击逻辑,也可以给自定义View设置监听器:
val customView = findViewById<ClickableLayerView>(R.id.custom_layer_view) customView.setOnClickListener { // 补充点击逻辑 }
内容的提问来源于stack exchange,提问作者togzi
相关产品推荐
相关产品推荐

