【问题标题】:How to write a generic BindingAdapter to setup an OnLongClickListener?如何编写通用 BindingAdapter 来设置 OnLongClickListener?
【发布时间】:2019-07-24 11:00:36
【问题描述】:

在我的 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}"

【问题讨论】:

    标签: android kotlin android-databinding method-reference onlongclicklistener


    【解决方案1】:

    视图模型:

    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" />
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-27
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 2012-09-03
      • 2021-06-28
      相关资源
      最近更新 更多