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