使用“ & &”逻辑运算符的 android 数据绑定

我尝试使用和“ & &”操作符在 xml 中使用 Android 数据绑定,

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

但是我得到了编译错误:

错误: 任务“ : app: dataBindingProcessLayoutsDevDebug”执行失败。 SystemId: file:/Users/path/app/build/mediates/res/merge/dev/debug/layp/Frag_ space. xml; lineNumber: 106; column nNumber: 89; 实体名称必须紧跟在实体引用中的“ &”之后。

和红色突出显示错误在机器人工作室“未逃脱 & 或非终止字符”。

那我该怎么补救?

编辑: 找到了答案,这些角色需要逃脱:

'&' --> '&'


'<' --> '&lt;'


'>' --> '&gt;'
76174 次浏览

&&应该呈现为 &amp;&amp;

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

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

剪辑

我在答案中提到的示例表达式从文档的英文版本中消失了,因为这个答案已经写好了。它们确实存在于一些过时的非英文版本的文档中,如西班牙文版本。

不管怎样,最初的答案仍然有效,因为在 XML 中使用 XML 实体是 XML 中的标准,与 Android 本身没有任何关系。

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

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


public boolean isAdult() {
return age >= 18;
}

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

以前:

返回文章页面

<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);
}

之后:

返回文章页面

<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 中不能使用 & 或其他 < a href = “ https://en.wikipedia.org/wiki/List _ of _ XML _ and _ HTML _ role _ tity _ reference # PreDefinition _ tity _ in _ XML”rel = “ noReferrer”> 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 实体的完整列表。

在 XML 中尝试“ compareTo”方法,如

android:visibility=${viewModel.intValue.compareTo(0) == -1 ? View.GONE : View.VISIBLE}"