Android Databinding onLong点击不起作用

时间:2017-10-11 06:01:49

标签: 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" />

6 个答案:

答案 0 :(得分:24)

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

在xml中

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

在演示者视图模型类

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

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

答案 1 :(得分:3)

这是完整的代码。

没有可用于长时间点击的属性。所以我们必须创建一个绑定适配器。

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

答案 2 :(得分:1)

您应该查看此document

OnLongClick和onClick一样简单

在你的SystemSettingsViewModel内你可以拥有

public boolean onLongClick(){}

和xml

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

答案 3 :(得分:0)

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

boolean onLongClick(View view);

所以这就是我开始工作的方式:

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

答案 4 :(得分:0)

如Google文档Link中所述,您编写的内容没有问题。

这是XML中的OnLongClick的示例:

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

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

答案 5 :(得分:0)

在xml部分,您必须引用布尔返回函数,例如以下代码,以免麻烦。在构建项目android studio中

在xml

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

在Java

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