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

使用“android数据绑定”&&&引用;逻辑运算符,android,android-databinding,bindable,Android,Android Databinding,Bindable,我正在尝试使用Android数据绑定在xml中使用and“&&”运算符 android:visibility=“@{(bean.currentSpaceId==bean.selectedSpaceId**&**bean.currentSpaceId>0)?View.visibility:View.GONE}” 但我得到了编译错误: 错误:任务“:app:dataBindingProcessLayoutsDevDebug”的执行失败。 org.xml.sax.SAXParseException;s

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

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

但我得到了编译错误:

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

android studio中的红色突出显示错误“unscaped&或non-terminated character”

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

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

'&' --> '&'

'<' --> '&lt;'

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

&&
应呈现为
&&

例如,这位官员提供了使用这些XML实体的比较运算符的示例

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

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


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

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

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

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

我能想出的解决这个问题的最好办法是引入一种新的可绑定方法

之前:
item\u recyclerview.xml

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !myViewModel.myDataModelClass.editTextDisabled}"
/>
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>
之后:
item\u recyclerview.xml

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !myViewModel.myDataModelClass.editTextDisabled}"
/>
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>
HTML实体列表 不能在XML中使用&或其他。所以你必须使用转义字符

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实体| | ||
+--------+----------------------------+--+--+--+
| >      |                        |  |  |  |
+--------+----------------------------+--+--+--+
| <      |                        |  |  |  |
+--------+----------------------------+--+--+--+
|“|”,即;或“|||”|
+--------+----------------------------+--+--+--+
||&apos&现状;或|
+--------+----------------------------+--+--+--+
| }      | }                     |  |  |  |
+--------+----------------------------+--+--+--+
|和|和| ||
+--------+----------------------------+--+--+--+
|空格 ;| | ||
+--------+----------------------------+--+--+--+

是HTML实体的完整列表。

虽然这是一个很好的解决方案,但不幸的是,当变量值更改(notifyPropertyChanged)时,它不会被调用,并且可见性不会被更新。@BerndKampl Use
ObservableBolean isAdult
这不起作用,它只会被调用一次@BerndKampl如何使用它,它仍然会被调用once@CodingTT看看我的答案,你需要一个notifyPropertyChanged调用来更新它。不要在绑定表达式中使用域逻辑,你有用于此的预设器/控制器。@ArtjomKönig如果你必须在UI中隐藏/显示一些控件,该怎么办?我使用数据绑定库不编写UIcode@KrustyIMElement演示程序中的方法IsMyControl Visible(),您可以使用域逻辑返回true或false。绑定到这个方法。我认为如果你有太多的布尔变量,这个解决方案是好的。否则,您的代码将具有大量的可观察性。set@artkoenig然后,您必须在引用布局的任何地方维护这些额外的布尔值。Bug的来源。我注意到我可以使用“>”和“代码使用的是BaseObservable类,BR是生成的绑定类。有关更详细的解释,请参阅本文: