我想让我的布局xml中的onClick()
触发来自两个视图模型的两个方法。
代码:
<Button
android:onClick="@{() -> model.onButtonClick()}"
... />
上面的代码调用一个方法,我希望它从不同的视图模型调用另一个方法。
我要添加的函数调用:model2.onButtonClick()
有可能吗?如果是,请添加一个最小的示例。 (期待xml解决方案)
注意::视图模型在xml中作为参数传递。 (数据绑定变量)
编辑1:这两个功能位于两个不同的视图模型中。因此,我(经过一些研究)知道在另一个视图内部使用/声明/初始化一个视图模型不是一个好习惯。
我可以在片段中创建一个Click侦听器,然后在其中调用这两个函数。但是我想消除片段中的点击监听器(根据MVVM的视图)。
我不是在寻找某种可能的方式。我正在寻找一种最佳实践方法,该方法旨在实现MVVM,关注点分离和数据绑定。
答案 0 :(得分:1)
您有两个选择,
fun method1() {
//do stuff
method2()
}
fun method2() {
//do more stuff
}
fun onClickMethod () {
method1()
method2()
}
fun method1() {
//do stuff
}
fun method2() {
//do stuff
}
答案 1 :(得分:0)
在xml中,导入两个视图模型,并将它们作为参数传递给自定义方法,该自定义方法将从视图模型中调用每个方法。
我以前从未尝试过,但是应该可以。 让我知道你是否不理解
答案 2 :(得分:0)
XML实现
<?xml version="1.0" encoding="utf-8"?>
<!-- layout elements -->
<Button android:id="@+id/mybutton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Click me!"
android:onClick="myFancyMethod" />
<!-- even more layout elements -->
代码实现
public void myFancyMethod(View v) {
// does something very interesting
}
答案 3 :(得分:0)
我找到了解决方案。也许很愚蠢,但简单却天才:
app:onRefreshListener="@{() -> dashboardVM.onRefresh() != homeVM.onRefresh()}"
方法需要返回true / false->无论如何。
对于任何其他方法,请使用OR
并始终返回false。
正确的解决方案应通过转换器实施。但是,这需要很多代码。
答案 4 :(得分:0)
使用高阶函数,我们可以同时触发两种方法
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<import type="android.view.View" />
<variable
name="cartViewModel"
type="com.rizek.android.users.ui.cart.CartViewModel" />
<variable
name="product"
type="com.rizek.android.users.model.productlist.Product" />
<variable
name="productInteractionListener"
type="com.rizek.android.users.adapters.recyclerview.cart.ProductListAdapter.ProductInteractionListener" />
</data>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
style="@style/text_medium"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawablePadding="8dp"
android:onClick="@{()->
productInteractionListener.onItemStateChanged(product,cartViewModel.addProduct(product))
}"
android:padding="8dp"
android:text="Add to basket"
android:textColor="@color/blue"
android:textSize="14sp"
app:drawableStartCompat="@drawable/ic_add_circle"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</layout>
ProductInteractionListener
interface ProductInteractionListener {
fun onItemStateChanged(product: Product, action: () -> Unit)
}