首页 > 解决方案 > ViewModel 数据绑定背景颜色

问题描述

我想将我的应用程序的状态显示为 ConstraintLayout 的颜色。我的应用程序是单一活动并使用 MVVM。

private val _status = NonNullMutableLiveData(NacinDelaEnum.OFFLINE)
val status:LiveData<NacinDelaEnum>
        get()=_status

根据status我想为 ConstraintLayout 的背景着色的值。

NacinDelaEnum 只是一个简单的枚举类

enum class NacinDelaEnum {
ONLINEEXT,ONLINEINT,OFFLINE
}

当用户启动应用程序时,我在内部 ping,然后在外部,并根据我更改 _status.

如果OFFLINE我希望背景是红色、ONLINEINT绿色和ONLINEEXT蓝色。

我努力了

val back: LiveData<Int> = Transformations.switchMap(_status){
    someFunc(it)
}

private fun someFunc(status: NacinDelaEnum) =
    when(status){
    NacinDelaEnum.ONLINEINT->MutableLiveData(Color.GREEN)
    NacinDelaEnum.OFFLINE->MutableLiveData(Color.RED)
    NacinDelaEnum.ONLINEEXT->MutableLiveData(Color.GREEN)
}

在xml中

android:background="@{safeUnbox(viewModel.back)}"

我也有这个正确导入,因为它适用于另一个变量。

<variable name="viewModel" type="com.example.mjagrosk.viewmodels.SettingsViewModel"/>

我想我的转换是不对的。我怎么能做到?

谢谢

标签: androidmvvmandroid-databindingandroid-viewmodel

解决方案


使用 BindingAdapter 将 NacinDelaEnum 直接应用于视图怎么样?

@BindingAdapter("nacinDela")
fun setBackground(view: View, nacinDela: NacinDelaEnum) {
    view.setBackgroundColor(view.context.getColor(getColorValue(nacinDela)))
}

fun getColorValue(nacinDela: NacinDelaEnum): Int {
    when(status){
        NacinDelaEnum.ONLINEINT-> MutableLiveData(Color.GREEN)
        NacinDelaEnum.OFFLINE->MutableLiveData(Color.RED)
        NacinDelaEnum.ONLINEEXT->MutableLiveData(Color.GREEN)
}

推荐阅读