【问题标题】:How to pass a constant to onClick listener in android data binding如何在android数据绑定中将常量传递给onClick侦听器
【发布时间】:2021-02-19 15:27:42
【问题描述】:

我刚刚进入 android MVVM。在我的项目中,我有 3 个 TextView,它们将作为一个广播组工作。

在上图中,将一次选择任何选项。

用于此的 XML 是

<data>
    <variable
        name="viewModel"
        type="com.builders.aimsfinance.ui.common.newcandidate.NewCandidateViewModel" />
</data>
   **** Some XML *****
        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/candidateSite"
            android:text="Site"
            android:onClick="@{()-> viewModel.setCandidateType()}"
            android:textAlignment="center"
            android:padding="5dp"
            android:layout_margin="5dp"
            android:textColor="@color/purple_700"
            android:background="@drawable/big_rounded_rectangle"
            android:backgroundTint="@color/purple_700"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/candidateShop"
            android:text="Shop"
            android:onClick="@{()-> viewModel.setCandidateType()}"
            android:textAlignment="center"
            android:padding="5dp"
            android:layout_margin="5dp"
            android:textColor="@color/purple_700"
            android:background="@drawable/big_rounded_rectangle"
            android:backgroundTint="@color/purple_700"/>

        <TextView
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:id="@+id/candidateEmployee"
            android:text="Employee"
            android:onClick="@{()-> viewModel.setCandidateType()}"
            android:textAlignment="center"
            android:padding="5dp"
            android:layout_margin="5dp"
            android:textColor="@color/purple_700"
            android:background="@drawable/big_rounded_rectangle"
            android:backgroundTint="@color/purple_700"/>

   **** Some XML *****

在我的 ViewModel 中,我实现了以下功能

class NewCandidateViewModel() : ViewModel() {
    var typ = MutableLiveData<Int>()

    fun setCandidateType(type: Int) {
        typ.value = type
    }
}

在这里,我为所有 TextViews 设置了一个公共处理函数 viewModel.setCandidateType(),并且我必须在单击每个 TextViews 时传递一个特定的整数。传递像viewModel.setCandidateType(1) 这样的硬编码值可以正常工作。但我认为这不是一个合适的解决方案。

我的疑问是,如何将这种类型的自定义值从 XML 传递给这个处理函数?这样做的正确方法是什么?

【问题讨论】:

    标签: android mvvm data-binding


    【解决方案1】:

    在视图中:

    mViewModel.onSelectTypeEvent.observe(viewLifecycleOwner, EventObserver {
        when(it) {
            // some event
        }
    })
    

    在 ViewModel 中:

    private val _onSelectTypeEvent = MutableLiveData<Event<Int>>()
    val onSelectTypeEvent: LiveData<Event<Int>> = _onSelectTypeEvent
    
    fun onSiteClick() {
        _onSelectTypeEvent.value = Event(TYPE_SITE)
    }
    
    fun onShopClick() {
        _onSelectTypeEvent.value = Event(TYPE_SHOP)
    }
    
    fun onEmployeeClick() {
        _onSelectTypeEvent.value = Event(TYPE_EMPLOYEE)
    }
    
    companion object {
        const val TYPE_SITE = 1
        const val TYPE_SHOP = 2
        const val TYPE_EMPLOYEE = 3
    }
    

    【讨论】:

    • 我必须使用哪个 Event 类?,你能添加那部分吗,我是 MVVM 的新手
    • 如果没有数据要传递,建议使用Event ,否则可以根据需要决定使用哪种数据类型。
    猜你喜欢
    • 2016-09-03
    • 2018-03-17
    • 1970-01-01
    • 2019-03-29
    • 2017-08-27
    • 2010-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多