Android 数据绑定 onLongClick 不工作
Android Databinding onLongClick not working
我有一个文本视图,我需要为其创建 onLongClick 侦听器。
现在对于相应的视图模型,它有一个函数 sendLogs() 处理 onClick 的逻辑。如果我将 onClick 更改为 onLongClick 函数,则永远不会调用。有什么办法让它适用于 onLongClick 吗?
onClick 直接链接到我的模型 class 函数而不是 onLongClick。所以我认为模型 class 绑定是正确的,但我可能需要在这里做一些额外的工作。
<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" />
你应该看看这个document
OnLongClick 和 onClick 一样简单
在您的 SystemSettingsViewModel
中,您可以拥有
public boolean onLongClick(){}
并在 xml
android:onLongClick="@{() -> presenter.onLongClick()}"
我设法正确地工作了。我怀疑这是否已正确记录。
在xml
android:onLongClick="@{(view) -> presenter.onLongClickOnHeading(view)}"
在演示者视图模型中class
public boolean onLongClickOnHeading(View v) {
//logic goes here
return false;
}
注意:此方法签名应完全采用此格式。否则将在运行时抛出出价错误。
要使其正常工作,括号中的部分必须与接口 View.OnLongClickListener 中的方法签名相匹配,如下所示:
boolean onLongClick(View view);
这就是我让它工作的方式:
<View
...
android:onLongClick="@{(view) -> listener.onLongClick(view, viewmodel)}"/>
...
正如 Google 文档中所述 Link 你写的没有问题。
这是 XML 中的 OnLongClick 示例:
android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"
class Presenter {
fun onLongClick(view: View, task: Task): Boolean { }
}
这是完整的代码。
长按没有该属性。所以我们必须创建一个绑定适配器。
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()}"/>
在xml部分,一定要参考布尔return函数,比如下面的代码,以免进入trouble.inbuild projectandroid工作室
在xml
android:onLongClick="@{(view) -> presenter.onLongClick(view)}"
在java
public boolean onLongClick(View v) {
return false;
}
我有一个文本视图,我需要为其创建 onLongClick 侦听器。 现在对于相应的视图模型,它有一个函数 sendLogs() 处理 onClick 的逻辑。如果我将 onClick 更改为 onLongClick 函数,则永远不会调用。有什么办法让它适用于 onLongClick 吗?
onClick 直接链接到我的模型 class 函数而不是 onLongClick。所以我认为模型 class 绑定是正确的,但我可能需要在这里做一些额外的工作。
<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" />
你应该看看这个document
OnLongClick 和 onClick 一样简单
在您的 SystemSettingsViewModel
中,您可以拥有
public boolean onLongClick(){}
并在 xml
android:onLongClick="@{() -> presenter.onLongClick()}"
我设法正确地工作了。我怀疑这是否已正确记录。
在xml
android:onLongClick="@{(view) -> presenter.onLongClickOnHeading(view)}"
在演示者视图模型中class
public boolean onLongClickOnHeading(View v) {
//logic goes here
return false;
}
注意:此方法签名应完全采用此格式。否则将在运行时抛出出价错误。
要使其正常工作,括号中的部分必须与接口 View.OnLongClickListener 中的方法签名相匹配,如下所示:
boolean onLongClick(View view);
这就是我让它工作的方式:
<View
...
android:onLongClick="@{(view) -> listener.onLongClick(view, viewmodel)}"/>
...
正如 Google 文档中所述 Link 你写的没有问题。
这是 XML 中的 OnLongClick 示例:
android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"
class Presenter {
fun onLongClick(view: View, task: Task): Boolean { }
}
这是完整的代码。
长按没有该属性。所以我们必须创建一个绑定适配器。
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()}"/>
在xml部分,一定要参考布尔return函数,比如下面的代码,以免进入trouble.inbuild projectandroid工作室
在xml
android:onLongClick="@{(view) -> presenter.onLongClick(view)}"
在java
public boolean onLongClick(View v) {
return false;
}