Android数据绑定中的onLongClick事件无效。

14

我有一个文本视图,需要为其创建一个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" />

请发布您完整的 XML 代码。 - Burhanuddin Rashid
@BurhanuddinRashid,我已经添加了布局的绑定部分。这就是与此问题相关的全部内容。 - M P Mathugama
这并不是很难,你应该试一下,看看我的答案。 - Akshay Katariya
6个回答

52

我成功地解决了它。我怀疑这并没有得到妥善的记录。

在xml中

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

在演示者视图模型类中

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

注意:这个方法签名必须严格按照这个格式。否则在运行时会抛出绑定错误。


10
方法签名的返回参数必须是"boolean"。 - Jovin
2
这个“必须是布尔值”的要求在常规的OnClick中并不适用,AS也不会在构建失败时显示这是原因。因此,请非常注意这一点。 - MwBakker
感谢该方法的返回参数。 - Ho Luong
这篇文章在2022年仍然有用!! - Terry Wilkinson

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

布局

<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 文件中,我使用了 'onLongClick' 方法,但是在另一个文件中没有使用该方法却出现了奇怪的编译错误。当使用这个方法时问题得到了解决。谢谢。 - epic

2
为了使其工作,括号中的部分必须与 View.OnLongClickListener 接口的方法签名匹配,其样式如下:
boolean onLongClick(View view);

这就是我使它工作的方法:

这是我让它工作的步骤:

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

1
在xml部分,您必须引用布尔返回函数,例如以下代码,以避免在构建项目Android Studio时遇到问题。
在xml中。
android:onLongClick="@{(view) -> presenter.onLongClick(view)}"

在Java中。
  public boolean onLongClick(View v) {
    return false;
}

0

你应该查看这个文档

长按事件和点击事件一样简单

在你的SystemSettingsViewModel中,你可以有

public boolean onLongClick(){}

并且使用 XML

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

2
应该是这样的。我阅读了那份文件并尝试了一下,但没有结果。编译器无法编译android:onLongClick()。 - M P Mathugama
2
遇到了同样的问题,而且调试器没有显示确切的问题,只有150行空白,直到它告诉我“1个错误”作为摘要。我的解决方案是监听器/处理程序中的方法必须是布尔值。 - MwBakker

0
如 Google 文档 Link 中所述,您所写的没有问题。
以下是 XML 中 OnLongClick 的示例:
android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接