[英]Custom click event with android data binding
我想在数据绑定中的每个点击事件上设置一个特定的动作(比如防止多次点击),换句话说,当用户点击每个视图时,首先做一个特定的动作,然后做与点击视图相关的动作(每个不同看法)。 我怎样才能做到这一点? 描述:我实现 MVVM 并使用数据绑定
这就是我在这种情况下所做的。
首先:在您的xml中添加onclick,在视图模型上调用方法并将其传递给视图
XML:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<variable
name="model"
type="....ViewModel" />
</data>
<View
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="@{(v)-> model.onClick(v)}"/>
</layout>
第二:使用 kotlin 扩展添加防止双击 Kotlin:
fun View.preventDoubleClick() {
isClickable = false
Handler().postDelayed({ isClickable = true },500L)
}
第三:
科特林:
fun onClick(view: View?){
view?.preventDoubleClick()
}
现在您可以访问在视图模型中单击的视图。 记得让你的视图可以为空。 这可以帮助您,例如,当您想为您的方法添加单元测试时,您只需发送视图 null。
首先:在您的 SomeViewModel 类中创建一个 boolean 类型的 mutableLiveData,初始值为 true
val data = MutableLiveData<Boolean>(true)
接下来在你的 xml
<data>
<variable
name="viewModel"
type="..SomeViewModel" />
</data>
<View
android:enabled = "@{viewModel.data}" // if working with button
android:clickable = "@{viewModel.data}" // for views which dont have enable tag
android:onClick="@{() -> viewModel.disableButtonAndPerformRequiredAction()}"/>
// In viewmodel
fun disableButtonAndPerformRequiredAction() {
data.value = false // it will disable the click for the view
// Perform other tasks
// post executing required task set
data.value = true // it will again enable the click for the view
}
所以,今天(2022 年)我在我的一个项目中有相同的用例,我能够找到一种方法来使用数据绑定和自定义适配器为 android 视图实现自定义点击侦听器。
用例是:
点击事件不应被触发两次或防止用户误点击
我创建了一个名为 ViewExtensions.kt 的文件并添加了以下代码
class DebouncingOnClickListener(
private val intervalMillis: Long,
private val doClick: (() -> Unit)
) : View.OnClickListener {
override fun onClick(v: View) {
if (enabled) {
enabled = false
v.postDelayed(ENABLE_AGAIN, intervalMillis)
doClick()
}
}
companion object {
@JvmStatic
var enabled = true
private val ENABLE_AGAIN =
Runnable { enabled = true }
}
}
@BindingAdapter("singleClick")
fun View.setSingleClick(doClick: () -> Unit) =
setOnClickListener(
DebouncingOnClickListener(
intervalMillis = 5000, //5ms delay for click event
doClick = doClick
)
)
debouncing click 用于延迟给定时间的点击,在 xml 中调用如下所示的点击事件
<androidx.appcompat.widget.AppCompatButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click Me"
app:singleClick="@{()->fragment.clicked()}" />
现在我可以在片段和视图模型中监听点击事件,并且点击会延迟给定的时间。
因此,用户不能意外地多次单击该视图。
参考资料: https://proandroiddev.com/ensure-single-click-on-android-butterknife-did-it-right-48ef56153c78
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.