Android数据绑定/ MVVM模式:基于Enum计算视图颜色

时间:2018-10-22 05:04:06

标签: android mvvm data-binding

我有一个带有以下枚举和变量的类:

enum class ExerciseSetState {
    NOT_STARTED, PASSED, FAILED
}

@Entity
class ExerciseEntity(
        ... 
        @Ignore var setState: ExerciseSetState = ExerciseSetState.NOT_STARTED
        ....
 )

在我的数据绑定布局中,我想基于此状态变量设置颜色:

<TextView
        android:id="@+id/tv_exer_rep_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:layout_marginTop="8dp"
        android:text="@{String.valueOf(exercise.setReps)}"
        android:backgroundColor="@{exercise.setState == ExerciseSetState.PASSED? (Color.GREEN : exercise.setState == ExerciseSetState.FAILED ? Color.RED: Color.TRANSPARENT )}"/>

不幸的是,我有一个非常可怕的三元表达式,以便根据该值计算颜色。

实现此目的的惯用方式是什么?

3 个答案:

答案 0 :(得分:1)

使用适配器使其简单:

 @BindingAdapter("xmlTag")
        public static void bindColor(TextView textView, @Nullable ExerciseSetState state) {
            //switch state and set the value
        }

在xml中:

app:xmlTag="@{exercies.setState}"

答案 1 :(得分:0)

您可以简单地在枚举中指定颜色。因为颜色与枚举有关。

enum class ExerciseSetState(var color: Int) {
    NOT_STARTED(Color.TRANSPARENT), PASSED(Color.GREEN), FAILED(Color.RED)
}

android:backgroundColor="@{exercise.setState.color}"

答案 2 :(得分:0)

创建一个Converter类并将其用于将枚举转换为颜色

布局:

<import type="*.Converter"/>
...

android:background="@{Converter.enumToColor(context, exercise.setState)}"

转换器类别:

class Converter {

    fun enumToColor(context: Context ,enum: ExerciseSetState) : Int {
        return when (enum){
            ExerciseSetState.NOT_STARTED -> getColor(context, R.color.colorAccent)
            ExerciseSetState.PASSED -> getColor(context, R.color.colorAccent)
            ExerciseSetState.FAILED -> getColor(context, R.color.colorAccent)
        }
    }
}

getColor 辅助方法:

fun getColor(context: Context, colorId: Int): Int {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        context.resources.getColor(colorId, null)
    } else {
        context.resources.getColor(colorId)
    }
}

最好在这里将setState更改为getState: