You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Kotlin代码中通过资源ID获取Drawable内元素并设置点击事件

在Kotlin的Activity中处理Drawable XML里元素的点击事件

你遇到的问题核心是——Drawable资源中的并不是View控件,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 23:30:18