Android 数据绑定 onLongClick 不工作

Android Databinding onLongClick not working

我有一个文本视图,我需要为其创建 onLongClick 侦听器。 现在对于相应的视图模型,它有一个函数 sendLogs() 处理 onClick 的逻辑。如果我将 onClick 更改为 onLongClick 函数,则永远不会调用。有什么办法让它适用于 onLongClick 吗?

onClick 直接链接到我的模型 class 函数而不是 onLongClick。所以我认为模型 class 绑定是正确的,但我可能需要在这里做一些额外的工作。

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

你应该看看这个document

OnLongClick 和 onClick 一样简单

在您的 SystemSettingsViewModel 中,您可以拥有

public boolean onLongClick(){}

并在 xml

android:onLongClick="@{() -> presenter.onLongClick()}"

我设法正确地工作了。我怀疑这是否已正确记录。

在xml

android:onLongClick="@{(view) -> presenter.onLongClickOnHeading(view)}"

在演示者视图模型中class

public boolean onLongClickOnHeading(View v) { 
   //logic goes here
   return false; 
}

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

要使其正常工作,括号中的部分必须与接口 View.OnLongClickListener 中的方法签名相匹配,如下所示:

boolean onLongClick(View view);

这就是我让它工作的方式:

<View
...
android:onLongClick="@{(view) -> listener.onLongClick(view, viewmodel)}"/>
...

正如 Google 文档中所述 Link 你写的没有问题。

这是 XML 中的 OnLongClick 示例:

android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"

class Presenter {
    fun onLongClick(view: View, task: Task): Boolean { }
}

这是完整的代码。

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

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
        }
    }
}

布局

<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()}"/> 

在xml部分,一定要参考布尔return函数,比如下面的代码,以免进入trouble.inbuild projectandroid工作室

在xml

android:onLongClick="@{(view) -> presenter.onLongClick(view)}"

在java

  public boolean onLongClick(View v) {
    return false;
}