使用“android数据绑定”&&&引用;逻辑运算符
我正在尝试使用Android数据绑定在xml中使用and“&&”运算符使用“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: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”
那么我该如何解决这个问题呢
编辑:
找到答案后,这些字符需要转义:
'&' --> '&'
'<' --> '<'
'>' --> '>'
'&'-->'&;'
'' --> ''
&&
应呈现为&&代码>
例如,这位官员提供了使用这些XML实体的比较运算符的示例
android:visibility="@{age < 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 && !myViewModel.myDataModelClass.editTextDisabled}"
/>
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>
之后:
item\u recyclerview.xml
:
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem && !myViewModel.myDataModelClass.editTextDisabled}"
/>
<EditText
...
android:enabled="@{myViewModel.myDataModelClass.enableEditing}"
/>
HTML实体列表
不能在XML中使用&或其他。所以你必须使用转义字符
android:text="@{(1==1 && 2>0) ? `true` : `false`}"
Android中常用的HTML字符实体:
+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity | | | |
+--------+----------------------------+--+--+--+
| > | > | | | |
+--------+----------------------------+--+--+--+
| < | < | | | |
+--------+----------------------------+--+--+--+
| " | ", “ or ” | | | |
+--------+----------------------------+--+--+--+
| ' | ', ‘ or ’ | | | |
+--------+----------------------------+--+--+--+
| } | } | | | |
+--------+----------------------------+--+--+--+
| & | & | | | |
+--------+----------------------------+--+--+--+
| space |   | | | |
+--------+----------------------------+--+--+--+
+--------+----------------------------+--+--+--+
|符号|等效HTML实体| | ||
+--------+----------------------------+--+--+--+
| > | | | | |
+--------+----------------------------+--+--+--+
| < | | | | |
+--------+----------------------------+--+--+--+
|“|”,即;或“|||”|
+--------+----------------------------+--+--+--+
||&apos&现状;或|
+--------+----------------------------+--+--+--+
| } | } | | | |
+--------+----------------------------+--+--+--+
|和|和| ||
+--------+----------------------------+--+--+--+
|空格 ;| | ||
+--------+----------------------------+--+--+--+
是HTML实体的完整列表。虽然这是一个很好的解决方案,但不幸的是,当变量值更改(notifyPropertyChanged)时,它不会被调用,并且可见性不会被更新。@BerndKampl UseObservableBolean isAdult
这不起作用,它只会被调用一次@BerndKampl如何使用它,它仍然会被调用once@CodingTT看看我的答案,你需要一个notifyPropertyChanged调用来更新它。不要在绑定表达式中使用域逻辑,你有用于此的预设器/控制器。@ArtjomKönig如果你必须在UI中隐藏/显示一些控件,该怎么办?我使用数据绑定库不编写UIcode@KrustyIMElement演示程序中的方法IsMyControl Visible(),您可以使用域逻辑返回true或false。绑定到这个方法。我认为如果你有太多的布尔变量,这个解决方案是好的。否则,您的代码将具有大量的可观察性。set@artkoenig然后,您必须在引用布局的任何地方维护这些额外的布尔值。Bug的来源。我注意到我可以使用“>”和“代码使用的是BaseObservable类,BR是生成的绑定类。有关更详细的解释,请参阅本文: