web-dev-qa-db-ja.com

「&&」論理演算子を使用したandroidデータバインディング

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の「エスケープされていない文字または終了していない文字」の赤いハイライトエラー。

それで、どうすれば修正できますか?

編集:答えが見つかりました、これらの文字はエスケープする必要があります:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'
94
David Cheung

&&&amp;&amp;としてレンダリングする必要があります。

公式の データバインディングガイド には、たとえばこれらのXMLエンティティが使用される比較演算子の例があります。

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

編集

この回答が書かれたため、回答で言及した表現例は英語版のドキュメントから消えました。それらは、スペイン語版などの古い英語以外のバージョンのドキュメントでも生き残ります。

いずれにしても、XMLでのXMLエンティティの使用はXMLの標準であり、Android自体とは関係がないため、元の答えは依然として有効です。

191

レイアウトマークアップでの&&のエスケープは、非常に貧弱なソリューションです。 (view)modelオブジェクトにメソッドを作成することをお勧めします:

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

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

HTMLエンティティのリスト

XMLではまたは他のHTMLエンティティを使用できません。そのため、エスケープ文字を使用する必要があります。

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エンティティの完全なリストです。

12
Khemraj

この問題を解決する最善の解決策は、新しいバインド可能メソッドを導入することでした。

前:

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();
}
1
Bernd Kampl