Android Databinding onLong点击不起作用

M P*_*ama 7 android android-layout android-databinding android-mvvm

我有一个文本视图,我需要为onLongClick创建一个监听器.现在对于相应的viewmodel,它有一个函数sendLogs(),它处理onClick的逻辑.如果我将onClick更改为onLongClick函数永远不会调用.有没有办法使它适用于onLongClick?

onClick直接链接到我的模型类函数,但不是onLongClick.所以我认为模型类绑定是正确的,但我可能需要一些额外的工作.

<data>
    <import type="android.view.View" />

    <variable
        type="com.aaa.bbb.viewmodel.SystemSettingsViewModel"
        name="systemSettings"
    </variable>
</data>

<TextView
    android:gravity="end"
    android:id="@+id/tv_logging"
    android:layout_centerVertical="true"
    android:layout_height="wrap_content"
    android:layout_marginRight="8dp"
    android:layout_width="wrap_content"
    android:onClick="@{() -> systemSettings.sendLogs()}"
    android:text="@string/enable_logs"
    android:textAlignment="viewEnd" />
Run Code Online (Sandbox Code Playgroud)

M P*_*ama 34

我设法正确地工作了.我怀疑这是否有适当的记录.

在xml中

android:onLongClick="@{(view) -> presenter.onLongClickOnHeading(view)}"
Run Code Online (Sandbox Code Playgroud)

在presenter viewmodel类中

public boolean onLongClickOnHeading(View v) { 
   //logic goes here
   return false; 
}
Run Code Online (Sandbox Code Playgroud)

注意:此方法签名应该完全采用此格式.否则将在运行时抛出biding错误.

  • 方法签名的返回参数必须为"boolean" (9认同)
  • 对于常规 OnClick,情况并非如此,并且 AS 不会显示这是构建失败的原因。所以要非常注意这一点。 (2认同)

Sha*_*hmi 5

这是完整的代码。

长按没有这个属性。所以我们必须创建一个绑定适配器。

BindingUtils.kt

object BindingUtils {

    private const val ON_LONG_CLICK = "android:onLongClick"

    @JvmStatic
    @BindingAdapter(ON_LONG_CLICK)
    fun setOnLongClickListener(
        view: View,
        func : () -> Unit
    ) {
        view.setOnLongClickListener {
            func()
            return@setOnLongClickListener true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

布局

<androidx.constraintlayout.widget.ConstraintLayout
    android:background="?android:attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="10dp"
    android:onLongClick="@{() -> vm.onLongClick()}"/> 
Run Code Online (Sandbox Code Playgroud)