我有一个文本视图,我需要为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" />
答案 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;
}