Android привязка данных / шаблон MVVM: вычисление цвета представления на основе Enum - PullRequest
0 голосов
/ 22 октября 2018

У меня есть класс со следующими перечислениями и переменными:

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 голосов
/ 22 октября 2018

Вы можете просто указать цвета в перечислении.Потому что цвета относятся к enum.

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

и

android:backgroundColor="@{exercise.setState.color}"
0 голосов
/ 27 октября 2018

Создайте класс Converter и используйте его для преобразования enum в цвет

Макет:

<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 здесь:)

0 голосов
/ 22 октября 2018

Упростите это с помощью адаптера:

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

в xml:

app:xmlTag="@{exercies.setState}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...