Android 在自定义视图按钮中实现 OnClickListener 时,XML 的 onclick 不起作用
Android onclick of XML doesnt work when OnClickListener is implemented in customview button
当用户单击按钮时我需要一个小动画,当动画结束时它应该执行单击操作。
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
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。
这将不起作用,因为您正试图在这些位置的视图上设置多个点击侦听器:
android:onClick="@{()->viewModel.onButtonClick(true)}"
和
setOnClickListener(this)
如果我对你的问题理解正确,一旦用户点击按钮,应该首先出现动画,然后在相应的视图模型中执行操作。
您可以在 CustomButton class 和 ViewModel
之间实现一个接口
interface CustomButtonClickListener {
fun onClick()
}
在您的 ViewModel 中实现此接口。使用数据绑定,将此接口侦听器发送到具有自定义属性的 CustomButton。像这样:
<data>
<variable name="vm"
type="*path_vm*" />
</data>
并将此虚拟机传递给您的 CustomLabel
app:listener="@{vm}"
您可以参考 this 为您的 CustomLabel 创建自定义属性 class
现在你的按钮动画结束后,你只需要调用接口方法,ViewModel的重写方法应该被调用
listener.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
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。
这将不起作用,因为您正试图在这些位置的视图上设置多个点击侦听器:
android:onClick="@{()->viewModel.onButtonClick(true)}"
和
setOnClickListener(this)
如果我对你的问题理解正确,一旦用户点击按钮,应该首先出现动画,然后在相应的视图模型中执行操作。
您可以在 CustomButton class 和 ViewModel
之间实现一个接口interface CustomButtonClickListener {
fun onClick()
}
在您的 ViewModel 中实现此接口。使用数据绑定,将此接口侦听器发送到具有自定义属性的 CustomButton。像这样:
<data>
<variable name="vm"
type="*path_vm*" />
</data>
并将此虚拟机传递给您的 CustomLabel
app:listener="@{vm}"
您可以参考 this 为您的 CustomLabel 创建自定义属性 class
现在你的按钮动画结束后,你只需要调用接口方法,ViewModel的重写方法应该被调用
listener.onClick()
如果您有任何其他问题,请告诉我:)