android 使用“&&”逻辑运算符进行数据绑定
android databinding using "&&" logical operator
我正在尝试使用 Android 数据绑定在 xml 中使用和“&&”运算符,
android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"
但是我得到了编译错误:
Error:Execution failed for task ':app:dataBindingProcessLayoutsDevDebug'.
org.xml.sax.SAXParseException; systemId: file:/Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; lineNumber: 106; columnNumber: 89; The entity name must immediately follow the '&' in the entity reference.
和 android 工作室 "unescaped & or non terminated character" 中的红色突出显示错误。
那么我该如何解决这个问题?
编辑:
找到答案,这些字符需要转义:
'&' --> '&'
'<' --> '<'
'>' --> '>'
&&
应呈现为 &&
.
官方data binding guide有使用这些XML实体的比较运算符的例子,例如
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
编辑
自从撰写此答案后,我在答案中提到的示例表达式从英文版文档中消失了。它们确实存在于一些过时的非英语版本的文档中,例如西班牙语版本。
不管怎样,原来的答案仍然有效,因为在XML中使用XML实体是XML中的标准,与Android无关本身。
在布局标记中转义 & 是一个非常糟糕的解决方案。最好在 (view)model 对象上创建一个方法:
android:visibility="@{user.adult ? View.VISIBLE : View.GONE}"
public boolean isAdult() {
return age >= 18;
}
对于这个问题,我能想到的最佳解决方案是引入一个新的 Bindable 方法。
之前:
item_recyclerview.xml
:
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem && !myViewModel.myDataModelClass.editTextDisabled}"
/>
MyDataModelClass
:(在我的视图模型中)
...
private boolean lastAddedItem;
private boolean editTextDisabled;
...
@Bindable
public boolean isLastAddedItem() {
return lastAddedItem;
}
public void setLastAddedItem(boolean lastAddedItem) {
this.lastAddeditem = lastAddedItem;
notifyPropertyChanged(BR.lastAddedItem);
}
@Bindable
public boolean isEditTextDisabled() {
return editTextDisabled;
}
public void setEditTextDisabled(boolean editTextDisabled) {
this.editTextDisabled = editTextDisabled;
notifyPropertyChanged(BR.editTextDisabled);
}
之后:
item_recyclerview.xml
:
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>
MyDataModelClass
:(在我的视图模型中)
...
private boolean lastAddedItem;
private boolean editTextDisabled;
...
@Bindable
public boolean isLastAddedItem() {
return lastAddedItem;
}
public void setLastAddedItem(boolean lastAddedItem) {
this.lastAddeditem = lastAddedItem;
notifyPropertyChanged(BR.lastAddedItem);
notifyPropertyChanged(BR.isEnableEditing);
}
@Bindable
public boolean isEditTextDisabled() {
return editTextDisabled;
}
public void setEditTextDisabled(boolean editTextDisabled) {
this.editTextDisabled = editTextDisabled;
notifyPropertyChanged(BR.editTextDisabled);
notifyPropertyChanged(BR.isEnableEditing);
}
@Bindable
public boolean isEnableEditing() {
return isLastAddedItem() && !isEditTextDisabled();
}
HTML 个实体列表
您不能在 XML 中使用 & 或其他一些 HTML entity。所以你必须使用转义字符。
android:text="@{(1==1 && 2>0) ? `true` : `false`}"
HTML Android中常用的字符实体:
+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity | | | |
+--------+----------------------------+--+--+--+
| > | > | | | |
+--------+----------------------------+--+--+--+
| < | < | | | |
+--------+----------------------------+--+--+--+
| " | ", “ or ” | | | |
+--------+----------------------------+--+--+--+
| ' | ', ‘ or ’ | | | |
+--------+----------------------------+--+--+--+
| } | } | | | |
+--------+----------------------------+--+--+--+
| & | & | | | |
+--------+----------------------------+--+--+--+
| space |   | | | |
+--------+----------------------------+--+--+--+
Here 是 HTML 个实体的完整列表。
在XML中尝试'compareTo'方法
android:visibility=${viewModel.intValue.compareTo(0) == -1 ? View.GONE : View.VISIBLE}"
我正在尝试使用 Android 数据绑定在 xml 中使用和“&&”运算符,
android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"
但是我得到了编译错误:
Error:Execution failed for task ':app:dataBindingProcessLayoutsDevDebug'. org.xml.sax.SAXParseException; systemId: file:/Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; lineNumber: 106; columnNumber: 89; The entity name must immediately follow the '&' in the entity reference.
和 android 工作室 "unescaped & or non terminated character" 中的红色突出显示错误。
那么我该如何解决这个问题?
编辑: 找到答案,这些字符需要转义:
'&' --> '&'
'<' --> '<'
'>' --> '>'
&&
应呈现为 &&
.
官方data binding guide有使用这些XML实体的比较运算符的例子,例如
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
编辑
自从撰写此答案后,我在答案中提到的示例表达式从英文版文档中消失了。它们确实存在于一些过时的非英语版本的文档中,例如西班牙语版本。
不管怎样,原来的答案仍然有效,因为在XML中使用XML实体是XML中的标准,与Android无关本身。
在布局标记中转义 & 是一个非常糟糕的解决方案。最好在 (view)model 对象上创建一个方法:
android:visibility="@{user.adult ? View.VISIBLE : View.GONE}"
public boolean isAdult() {
return age >= 18;
}
对于这个问题,我能想到的最佳解决方案是引入一个新的 Bindable 方法。
之前:
item_recyclerview.xml
:
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem && !myViewModel.myDataModelClass.editTextDisabled}"
/>
MyDataModelClass
:(在我的视图模型中)
...
private boolean lastAddedItem;
private boolean editTextDisabled;
...
@Bindable
public boolean isLastAddedItem() {
return lastAddedItem;
}
public void setLastAddedItem(boolean lastAddedItem) {
this.lastAddeditem = lastAddedItem;
notifyPropertyChanged(BR.lastAddedItem);
}
@Bindable
public boolean isEditTextDisabled() {
return editTextDisabled;
}
public void setEditTextDisabled(boolean editTextDisabled) {
this.editTextDisabled = editTextDisabled;
notifyPropertyChanged(BR.editTextDisabled);
}
之后:
item_recyclerview.xml
:
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>
MyDataModelClass
:(在我的视图模型中)
...
private boolean lastAddedItem;
private boolean editTextDisabled;
...
@Bindable
public boolean isLastAddedItem() {
return lastAddedItem;
}
public void setLastAddedItem(boolean lastAddedItem) {
this.lastAddeditem = lastAddedItem;
notifyPropertyChanged(BR.lastAddedItem);
notifyPropertyChanged(BR.isEnableEditing);
}
@Bindable
public boolean isEditTextDisabled() {
return editTextDisabled;
}
public void setEditTextDisabled(boolean editTextDisabled) {
this.editTextDisabled = editTextDisabled;
notifyPropertyChanged(BR.editTextDisabled);
notifyPropertyChanged(BR.isEnableEditing);
}
@Bindable
public boolean isEnableEditing() {
return isLastAddedItem() && !isEditTextDisabled();
}
HTML 个实体列表
您不能在 XML 中使用 & 或其他一些 HTML entity。所以你必须使用转义字符。
android:text="@{(1==1 && 2>0) ? `true` : `false`}"
HTML Android中常用的字符实体:
+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity | | | |
+--------+----------------------------+--+--+--+
| > | > | | | |
+--------+----------------------------+--+--+--+
| < | < | | | |
+--------+----------------------------+--+--+--+
| " | ", “ or ” | | | |
+--------+----------------------------+--+--+--+
| ' | ', ‘ or ’ | | | |
+--------+----------------------------+--+--+--+
| } | } | | | |
+--------+----------------------------+--+--+--+
| & | & | | | |
+--------+----------------------------+--+--+--+
| space |   | | | |
+--------+----------------------------+--+--+--+
Here 是 HTML 个实体的完整列表。
在XML中尝试'compareTo'方法
android:visibility=${viewModel.intValue.compareTo(0) == -1 ? View.GONE : View.VISIBLE}"