M P*_*ama 7 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" />
Run Code Online (Sandbox Code Playgroud)
M P*_*ama 34
我设法正确地工作了.我怀疑这是否有适当的记录.
在xml中
android:onLongClick="@{(view) -> presenter.onLongClickOnHeading(view)}"
Run Code Online (Sandbox Code Playgroud)
在presenter viewmodel类中
public boolean onLongClickOnHeading(View v) {
//logic goes here
return false;
}
Run Code Online (Sandbox Code Playgroud)
注意:此方法签名应该完全采用此格式.否则将在运行时抛出biding错误.
这是完整的代码。
长按没有这个属性。所以我们必须创建一个绑定适配器。
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
}
}
}
Run Code Online (Sandbox Code Playgroud)
布局
<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()}"/>
Run Code Online (Sandbox Code Playgroud)