我有一个带有以下枚举和变量的类:
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 )}"/>
不幸的是,我有一个非常可怕的三元表达式,以便根据该值计算颜色。
实现此目的的惯用方式是什么?
答案 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: