首页 > 解决方案 > 在自定义视图按钮中实现 OnClickListener 时,XML 的 Android onclick 不起作用

问题描述

当用户单击按钮时,我需要一个小动画,当动画结束时,它应该执行单击操作。

XML

<com.customview.CustomButton
            android:id="@+id/btn_submit"
            bind_fontStyle="@{@string/button_bold}"
            android:layout_width="@dimen/standard_button_width"
            android:layout_height="@dimen/standard_button_height"
            android:text="@{viewModel.btnText}"
            android:onClick="@{()->viewModel.onButtonClick(true)}"
            android:visibility="@{viewModel.isButtonVisible() ? View.VISIBLE : View.GONE}"
            />

自定义类

class CustomButton : AppCompatButton, View.OnClickListener {

constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(
    context,
    attrs,
    defStyle
) {
    init()
}

constructor(context: Context, attrs: AttributeSet) : super(context, attrs) {
    init()
}

constructor(context: Context) : super(context) {
    init()
}

private fun init() {
    setOnClickListener(this)
}

override fun onClick(v: View) {
    v.post(Runnable {
        v.animate().scaleX(1.05f).scaleY(1.05f).setDuration(200).withEndAction {
            v.animate().scaleX(1f).scaleY(1f).setStartDelay(200)

        }
    })
}

}

我试图在自定义视图中覆盖 OnClickListener,在点击时我已经完成了动画,但问题是它没有调用 xml 的 android:onClick。

标签: androidkotlinandroid-custom-viewandroid-databinding

解决方案


这将不起作用,因为您试图在以下位置的视图上设置多个单击侦听器:

android:onClick="@{()->viewModel.onButtonClick(true)}"

setOnClickListener(this)

如果我正确理解您的问题,一旦用户单击按钮,应该首先发生动画,然后应该在相应的视图模型中采取行动。

您可以在 CustomButton 类和 ViewModel 之间实现接口

interface CustomButtonClickListener {
fun onClick()
}

在您的 ViewModel 中实现此接口。使用数据绑定,将此接口侦听器发送到具有自定义属性的 CustomButton。像这样的东西:

<data>
<variable name="vm"
          type="*path_vm*" />
</data>

并将此虚拟机传递给您的 CustomLabel

app:listener="@{vm}"

您可以参考内容为您的 CustomLabel 类创建自定义属性

现在,在您的按钮动画结束后,您只需要调用接口方法,并且应该调用 ViewModel 的覆盖方法

listener.onClick()

如果您有任何其他问题,请告诉我:)


推荐阅读