如何在 android 数据绑定中将常量传递给 onClick 侦听器

How to pass a constant to onClick listener in android data binding

我刚刚进入 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
    }
}

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

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

在视图中:

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

在视图模型中:

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
}