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

时间:2016-05-11 03:54:09

标签: android android-databinding bindable

我正在尝试使用和“&&” xml中的operator使用Android数据绑定,

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

但是我收到了编译错误:

  

错误:任务':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;实体名称必须紧跟'&'在实体参考中。

和安卓工作室中的红色突出显示错误“未转义和未终止字符”。

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

修改 找到答案,这些角色需要逃脱:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'

4 个答案:

答案 0 :(得分:182)

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

官方data binding guide包含使用这些XML实体的比较运算符的示例,例如

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

修改

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

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

答案 1 :(得分:15)

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

HttpURLConnection

答案 2 :(得分:9)

HTML实体列表

您不能在XML中使用或其他 HTML entity 。因此,您必须使用转义字符。

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;                     |  |  |  |
+--------+----------------------------+--+--+--+

Here 是HTML实体的完整列表。

答案 3 :(得分:0)

我能解决这个问题的最佳解决方案是引入一种新的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();
}