Привязка данных Android к условным ресурсам
Здесь типичное использование привязки данных Android:
android:background="@{isError ? @color/red : @color/white}"
Это становится сложнее, когда государство может принимать несколько значений. Изменить: использование атрибута status в вызове метода было единственным способом заставить его работать:
android:background="@{Check.getStatusColor(check.status)}"
и определить статический метод (не имеет @Bindable):
public int getStatusColor(int status) {
switch (status.get()) {
case STATUS_OK:
return ContextCompat.getColor(context, R.color.success);
case STATUS_WARNING:
return ContextCompat.getColor(context, R.color.warning);
case STATUS_ERROR:
return ContextCompat.getColor(context, R.color.error);
default:
return ContextCompat.getColor(context, R.color.idle);
}
}
Как я могу достичь этого, не помещая вложенные тернарные операторы в XML (который я не нахожу очень изящным, btw) или не передавая атрибут check.status
?
EDIT: Добавить XML:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="org.honorato.diagnostics.models.Check"/>
<variable
name="check"
type="Check"/>
</data>
<LinearLayout
android:background="@android:color/white"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="72dp"
>
<LinearLayout
android:padding="16dp"
android:layout_width="0dip"
android:layout_weight="1"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:text="@{check.title}"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textColor="@android:color/primary_text_light"
android:textStyle="bold" />
</LinearLayout>
<ImageView
android:padding="16dp"
android:src="@{check.getStatusDrawable(check.status)}"
android:background="@{check.getStatusColor(check.status)}"
android:layout_width="72dp"
android:layout_height="match_parent"
android:layout_gravity="center_vertical|center_horizontal" />
</LinearLayout>
</layout>
Ответы
Ответ 1
Я сделаю это следующим образом:
android:background="@{check.getStatusColor()}"
getStatusColor
- это нестатический метод Check
, и поэтому у нас есть доступ к нашему полю экземпляра status
public int getStatusColor() {
switch (status) {
case STATUS_OK:
return ContextCompat.getColor(context, R.color.success);
case STATUS_WARNING:
return ContextCompat.getColor(context, R.color.warning);
case STATUS_ERROR:
return ContextCompat.getColor(context, R.color.error);
default:
return ContextCompat.getColor(context, R.color.idle);
}
}
Это должно работать.