Androidデータバインディングを使用してxmlでand "&&"演算子を使用しようとしています。
Android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"
しかし、コンパイルエラーが発生しました:
エラー:タスク ':app:dataBindingProcessLayoutsDevDebug'の実行に失敗しました。 org.xml.sax.SAXParseException; systemId:ファイル:/Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; lineNumber:106; columnNumber:89;エンティティ名は、エンティティ参照の「&」の直後になければなりません。
Android studioの「エスケープされていない文字または終了していない文字」の赤いハイライトエラー。
それで、どうすれば修正できますか?
編集:答えが見つかりました、これらの文字はエスケープする必要があります:
'&' --> '&'
'<' --> '<'
'>' --> '>'
&&
は&&
としてレンダリングする必要があります。
公式の データバインディングガイド には、たとえばこれらのXMLエンティティが使用される比較演算子の例があります。
Android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
編集
この回答が書かれたため、回答で言及した表現例は英語版のドキュメントから消えました。それらは、スペイン語版などの古い英語以外のバージョンのドキュメントでも生き残ります。
いずれにしても、XMLでのXMLエンティティの使用はXMLの標準であり、Android自体とは関係がないため、元の答えは依然として有効です。
レイアウトマークアップでの&&のエスケープは、非常に貧弱なソリューションです。 (view)modelオブジェクトにメソッドを作成することをお勧めします:
Android:visibility="@{user.adult ? View.VISIBLE : View.GONE}"
public boolean isAdult() {
return age >= 18;
}
XMLでは&または他のHTMLエンティティを使用できません。そのため、エスケープ文字を使用する必要があります。
Android:text="@{(1==1 && 2>0) ? `true` : `false`}"
Androidでよく使用されるHTML文字エンティティ:
+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity | | | |
+--------+----------------------------+--+--+--+
| > | > | | | |
+--------+----------------------------+--+--+--+
| < | < | | | |
+--------+----------------------------+--+--+--+
| " | ", “ or ” | | | |
+--------+----------------------------+--+--+--+
| ' | ', ‘ or ’ | | | |
+--------+----------------------------+--+--+--+
| } | } | | | |
+--------+----------------------------+--+--+--+
| & | & | | | |
+--------+----------------------------+--+--+--+
| space |   | | | |
+--------+----------------------------+--+--+--+
ここはHTMLエンティティの完全なリストです。
この問題を解決する最善の解決策は、新しいバインド可能メソッドを導入することでした。
item_recyclerview.xml
:
<EditText
...
Android:enabled="@{myViewModel.myDataModelClass.lastAddedItem && !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();
}