首页 > 解决方案 > 如何编写通用 BindingAdapter 来设置 OnLongClickListener?

问题描述

在我的 Android 项目中,我使用以下内容BindingAdapterOnLongClickListener连接视图及其相应的视图模型。

@JvmStatic
@BindingAdapter(value = ["onLongClick", "onLongClickText"], requireAll = true)
fun setOnLongClickListener(view: View, viewModel: MyViewModel, text: CharSequence) {
    view.setOnLongClickListener {
        viewModel.onButton1LongClick(text)
        true
    }
}

...在 XML 布局中:

app:onLongClick="@{viewModel}"
app:onLongClickText="@{otherView.text}"

这是同一视图模型类中的第二个适配器:

@JvmStatic
@BindingAdapter("onLongClick")
fun setOnLongClickListener(view: View, viewModel: MyViewModel) {
    view.setOnLongClickListener {
        viewModel.onButton2LongClick()
        true
    }
}

...在 XML 布局中:

app:onLongClick="@{viewModel}"

我很想使可BindingAdapter 重用的,以便它可以连接到不同的视图。我想我可以从 XML 传递实际的方法引用。这是我不工作的草稿:

@JvmStatic
@BindingAdapter(value = ["onLongClick", "onLongClickText"], requireAll = true)
fun setOnLongClickListener(view: View, onLongClick: (CharSequence) -> Unit, text: CharSequence) {
    view.setOnLongClickListener {
        onLongClick.invoke(text)
        true
    }
}

...在 XML 布局中:

app:onLongClick="@{(view) -> viewModel.onButton1LongClick(???)}"
app:onLongClickText="@{otherView.text}"

标签: androidkotlinandroid-databindingmethod-referenceonlongclicklistener

解决方案


视图模型:

class MyViewModel : ViewModel() {

    private val TAG = "MyViewModel"

    fun onButton1LongClick(text: CharSequence) : Unit {
        Log.d(TAG, "onButton1LongClick: " + text)
    }
    val f1 : (CharSequence) -> Unit = {text -> onButton1LongClick(text)}

    fun onButton2LongClick() {
        Log.d(TAG, "onButton2LongClick")
    }
    val f2 : () -> Unit = {onButton2LongClick()}
}

绑定适配器:

@JvmStatic
@BindingAdapter(value = ["onLongClick", "onLongClickText"], requireAll = true)
fun setOnLongClickListener(view: View, onLongClick: (CharSequence) -> Unit, text: String?) {
    view.setOnLongClickListener {
        onLongClick.invoke(text?:"")
        true
    }
}

@JvmStatic
@BindingAdapter("onLongClick")
fun setOnLongClickListener(view: View, onLongClick: () -> Unit) {
    view.setOnLongClickListener {
        onLongClick.invoke()
        true
    }
}

XML 布局:

<EditText
    android:id="@+id/edit_text"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<Button
    onLongClick="@{viewModel.f1}"
    onLongClickText='@{editText.text.toString()}'
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Button 1" />

<Button
    onLongClick="@{viewModel.f2}"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Button 2" />

推荐阅读