如何使xml中的onClick()调用两种方法?

时间:2019-07-14 04:43:16

标签: android onclick android-databinding buttonclick

我想让我的布局xml中的onClick()触发来自两个视图模型的两个方法。

代码:

<Button
    android:onClick="@{() -> model.onButtonClick()}"
    ... />

上面的代码调用一个方法,我希望它从不同的视图模型调用另一个方法。
我要添加的函数调用:model2.onButtonClick()

有可能吗?如果是,请添加一个最小的示例。 (期待xml解决方案

注意::视图模型在xml中作为参数传递。 (数据绑定变量)

编辑1:这两个功能位于两个不同的视图模型中。因此,我(经过一些研究)知道在另一个视图内部使用/声明/初始化一个视图模型不是一个好习惯。

我可以在片段中创建一个Click侦听器,然后在其中调用这两个函数。但是我想消除片段中的点击监听器(根据MVVM的视图)。

我不是在寻找某种可能的方式。我正在寻找一种最佳实践方法,该方法旨在实现MVVM,关注点分离和数据绑定。

5 个答案:

答案 0 :(得分:1)

您有两个选择,

  1. 在第一种方法中调用第二种方法。
fun method1() {
//do stuff 
method2() 
} 
fun method2() {
//do more stuff
} 
  1. 如果您不想弄乱现有的代码结构,请创建一个单独的函数来调用这两个函数。
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)
        }