Android数据绑定onLongClick不起作用

Posted

技术标签:

【中文标题】Android数据绑定onLongClick不起作用【英文标题】:Android Databinding onLongClick not working 【发布时间】:2018-03-22 16:40:04 【问题描述】:

我有一个文本视图,我需要为它创建一个 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_
    android:layout_marginRight="8dp"
    android:layout_
    android:onClick="@() -> systemSettings.sendLogs()"
    android:text="@string/enable_logs"
    android:textAlignment="viewEnd" />

【问题讨论】:

发布完整的xml代码 @BurhanuddinRashidI 添加了布局的绑定部分。这都与这个问题有关。 没有什么难的,您应该尝试一下,请参阅下面的答案。 【参考方案1】:

我设法正常工作。我怀疑这是否被正确记录。

在xml中

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

在演示者视图模型类中

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

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

【讨论】:

方法签名的返回参数必须是“布尔” 这个“必须是布尔值”不是常规的 OnClick 的情况,AS 不会显示这是构建失败的原因。所以要非常注意这一点。 感谢方法的返回参数 这篇文章在 2022 年仍然有用!!【参考方案2】:

这里是完整的代码。

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

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_
    android:layout_
    android:padding="10dp"
    android:onLongClick="@() -> vm.onLongClick()"/> 

【讨论】:

在一个 .xml 文件中,我使用了没有这种方法的“onLongClick”,它没有问题,但在另一个没有,显示奇怪的编译错误。使用此方法时已解决。谢谢。【参考方案3】:

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

boolean onLongClick(View view);

这就是我的工作方式:

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

【讨论】:

【参考方案4】:

你应该看看这个document

OnLongClick 和 onClick 一样简单

在您的SystemSettingsViewModel 中,您可以拥有

public boolean onLongClick()

在xml中

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

【讨论】:

是的,应该是。我阅读了该文件并较早地尝试过。但没有结果。编译器使用 android:onLongClick() 编译失败 处理同样的问题,调试器也没有显示确切的问题,而是显示了 150 行空白,直到它告诉我“1 错误”作为总结我的解决方案是侦听器/处理程序中的方法必须是一个布尔值【参考方案5】:

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

这是 XML 中的 OnLongClick 示例:

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

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

【讨论】:

【参考方案6】:

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

在xml中

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

在java中

  public boolean onLongClick(View v) 
    return false;

【讨论】:

以上是关于Android数据绑定onLongClick不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android中按钮组的onLongClick监听器

onTouch, onLongClick 在 Android 中一起使用

Android中onTouchEvent, onClick及onLongClick的调用机制

如何在Android中访问菜单按钮onLongClick?

数据绑定不起作用 Android Studio 4.1

升级 Android Studio 2.3 后数据绑定不起作用