数据绑定中的开关盒
Switch case in Data Binding
是否可以使用 android 数据绑定编写 switch case?
假设我有 3 个条件
value == 1 then print A
value == 2 then print B
value == 3 then print C
有什么方法可以在 xml 中使用数据绑定来完成这些工作吗?
我知道我们可以实现像
这样的条件语句
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
但是我在这里搜索 switch case 语句。
不,据我所知这是不可能的,而且会使 xml 文件变得不可读。我认为最好在您的业务逻辑中实现它,而不是在布局文件中。
这在单独的 java class 业务逻辑中确实更好,但是如果您想在 xml 文件中使用数据绑定来完成此操作,则必须这样做使用更多内联 if 语句,如下所示:
android:text='@{TextUtils.equals(value, "1") ? "A" : TextUtils.equals(value, "2") ? "B" : TextUtils.equals(value, "3") ? "C" : ""}'
如您所见,您必须在 else 状态下添加每个下一个条件,这使得所有内容都难以阅读。
我会使用 BindingAdapter
。例如,可以像这样将枚举映射到 TextView 中的字符串(此示例使用枚举,但它可以与 int 或可在 switch 语句中使用的任何其他内容一起使用)。把这个放在你的 Activity class:
@BindingAdapter("enumStatusMessage")
public static void setEnumStatusMessage(TextView view, SomeEnum theEnum) {
final int res;
if (result == null) {
res = R.string.some_default_string;
} else {
switch (theEnum) {
case VALUE1:
res = R.string.value_one;
break;
case VALUE2:
res = R.string.value_two;
break;
case VALUE3:
res = R.string.value_three;
break;
default:
res = R.string.some_other_default_string;
break;
}
}
view.setText(res);
}
然后在您的布局中:
<TextView
app:enumStatusMessage="@{viewModel.statusEnum}"
tools:text="@string/some_default_string"
android:id="@+id/statusText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"/>
注意注释中的名称 enumStatusMessage
和 XML 标记。
是否可以使用 android 数据绑定编写 switch case?
假设我有 3 个条件
value == 1 then print A
value == 2 then print B
value == 3 then print C
有什么方法可以在 xml 中使用数据绑定来完成这些工作吗?
我知道我们可以实现像
这样的条件语句android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
但是我在这里搜索 switch case 语句。
不,据我所知这是不可能的,而且会使 xml 文件变得不可读。我认为最好在您的业务逻辑中实现它,而不是在布局文件中。
这在单独的 java class 业务逻辑中确实更好,但是如果您想在 xml 文件中使用数据绑定来完成此操作,则必须这样做使用更多内联 if 语句,如下所示:
android:text='@{TextUtils.equals(value, "1") ? "A" : TextUtils.equals(value, "2") ? "B" : TextUtils.equals(value, "3") ? "C" : ""}'
如您所见,您必须在 else 状态下添加每个下一个条件,这使得所有内容都难以阅读。
我会使用 BindingAdapter
。例如,可以像这样将枚举映射到 TextView 中的字符串(此示例使用枚举,但它可以与 int 或可在 switch 语句中使用的任何其他内容一起使用)。把这个放在你的 Activity class:
@BindingAdapter("enumStatusMessage")
public static void setEnumStatusMessage(TextView view, SomeEnum theEnum) {
final int res;
if (result == null) {
res = R.string.some_default_string;
} else {
switch (theEnum) {
case VALUE1:
res = R.string.value_one;
break;
case VALUE2:
res = R.string.value_two;
break;
case VALUE3:
res = R.string.value_three;
break;
default:
res = R.string.some_other_default_string;
break;
}
}
view.setText(res);
}
然后在您的布局中:
<TextView
app:enumStatusMessage="@{viewModel.statusEnum}"
tools:text="@string/some_default_string"
android:id="@+id/statusText"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="8dp"
android:layout_marginStart="8dp"
android:layout_marginTop="24dp"/>
注意注释中的名称 enumStatusMessage
和 XML 标记。