繁体   English   中英

带有 android 数据绑定的自定义点击事件

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM