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不起作用的主要内容,如果未能解决你的问题,请参考以下文章
onTouch, onLongClick 在 Android 中一起使用