161

我正在尝试使用Android数据绑定在xml中使用and“&&”运算符,

android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"

但我得到了编译错误:

错误:任务“:app:dataBindingProcessLayoutsDevDebug”执行失败。org.xml.sax.SAXParseException;systemId:文件:/Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml;行号:106;列号:89;实体名称必须紧跟实体引用中的“&”。

android studio“未转义&或非终止字符”中的红色突出显示错误。

那么我应该如何解决这个问题?

编辑: 找到答案,这些字符需要转义:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'
4

4 回答 4

288

&&应呈现为&amp;&amp;.

官方数据绑定指南有使用这些 XML 实体的比较运算符的示例,例如

android:visibility="@{age &lt; 13 ? View.GONE : View.VISIBLE}"

编辑

自编写此答案以来,我在答案中提到的示例表达式从文档的英文版中消失了。它们确实存在于一些过时的非英语版本的文档中,例如西班牙语版本。

无论哪种方式,最初的答案仍然有效,因为在 XML 中使用 XML 实体是 XML 中的标准,与 Android 本身无关。

于 2016-05-11T04:11:01.210 回答
56

HTML 实体列表

您不能在 XML 中使用&或其他一些HTML 实体。所以你必须使用转义字符。

android:text="@{(1==1 &amp;&amp; 2>0) ? `true` : `false`}"

Android中常用的HTML字符实体:

+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity     |  |  |  |
+--------+----------------------------+--+--+--+
| >      | &gt;                       |  |  |  |
+--------+----------------------------+--+--+--+
| <      | &lt;                       |  |  |  |
+--------+----------------------------+--+--+--+
| "      | &quot;, &ldquo; or &rdquo; |  |  |  |
+--------+----------------------------+--+--+--+
| '      | &apos;, &lsquo; or &rsquo; |  |  |  |
+--------+----------------------------+--+--+--+
| }      | &#125;                     |  |  |  |
+--------+----------------------------+--+--+--+
| &      | &amp;                      |  |  |  |
+--------+----------------------------+--+--+--+
| space  | &#160;                     |  |  |  |
+--------+----------------------------+--+--+--+

是 HTML 实体的完整列表。

于 2018-07-31T11:54:12.710 回答
19

在布局标记中转义 && 是一个非常糟糕的解决方案。最好在(视图)模型对象上创建一个方法:

android:visibility="@{user.adult ? View.VISIBLE : View.GONE}"

public boolean isAdult() {
    return age >= 18;
}
于 2016-09-30T10:04:15.243 回答
4

对于这个问题,我能想出的最佳解决方案是引入一种新的 Bindable 方法。

前:

item_recyclerview.xml

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !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();
}
于 2016-12-22T12:43:24.653 回答