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

Dav*_*ung 109 android bindable android-databinding

我试图使用Android数据绑定在xml中使用和"&&"运算符,

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;'
Run Code Online (Sandbox Code Playgroud)

SE *_*lio 210

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

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

android:visibility="@{age &lt; 13 ? View.GONE : View.VISIBLE}"
Run Code Online (Sandbox Code Playgroud)

编辑

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

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

  • 不要在绑定表达式中使用域逻辑,你有预置器/控制器. (9认同)
  • 是的,使用&amp;&amp;后立即使用. (4认同)
  • @ArtjomKönig 如果您必须在 UI 中隐藏/显示某些控件怎么办?我使用数据绑定库来不编写 UI 代码 (3认同)
  • @Krusty Imlement一个方法isMyControlVisible()在你的演示者中,你使用你的域逻辑返回true或false.绑定到这个方法. (3认同)
  • 我认为如果你有太多的布尔变量,这个解决方案很好。否则你的代码会有很多 ObservableBoolean.set (2认同)

Khe*_*raj 17

HTML实体清单

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

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

Android中经常使用的HTML字符实体:

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

是HTML实体的完整列表。


Oll*_*e C 15

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

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

public boolean isAdult() {
    return age >= 18;
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这是一个很好的解决方案,但遗憾的是,当变量值发生变化(notifyPropertyChanged)时,不会调用它,并且不会更新可见性. (4认同)
  • @BerndKampl使用```ObservableBoolean isAdult``` (2认同)

Ber*_*mpl 5

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

前:

item_recyclerview.xml

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !myViewModel.myDataModelClass.editTextDisabled}"
/>
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

后:

item_recyclerview.xml

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)