13

我有一个文本视图,需要为其创建 onLongClick 的侦听器。现在对于各自的视图模型,它有一个函数 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" />
4

6 回答 6

52

我设法正确地工作。我怀疑这是正确记录的。

在xml中

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

在演示者视图模型类中

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

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

于 2017-10-13T09:03:10.100 回答
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()}"/> 
于 2020-07-27T06:05:48.053 回答
2

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

boolean onLongClick(View view);

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

<View
...
android:onLongClick="@{(view) -> listener.onLongClick(view, viewmodel)}"/>
...
于 2018-02-12T01:39:48.317 回答
0

在xml部分,一定要参考布尔返回函数,比如下面的代码,以免惹上麻烦。在构建项目android studio

在xml中

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

在java中

  public boolean onLongClick(View v) {
    return false;
}
于 2020-10-22T11:14:35.820 回答
0

正如谷歌文档链接中提到的,你写的没有问题。

这是 XML 中的 OnLongClick 示例:

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

class Presenter {
    fun onLongClick(view: View, task: Task): Boolean { }
}
于 2019-10-21T06:25:17.880 回答
0

你应该看看这个文件

OnLongClick 和 onClick 一样简单

在你的范围内SystemSettingsViewModel你可以拥有

public boolean onLongClick(){}

并在 xml

android:onLongClick="@{() -> presenter.onLongClick()}"
于 2017-10-12T04:17:07.727 回答