Привязка данных android с использованием логического оператора "&&" - программирование
Подтвердить что ты не робот

Привязка данных android с использованием логического оператора "&&"

Я пытаюсь использовать & && оператора в xml с использованием привязки данных Android,

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; Имя объекта должно немедленно следовать за "&" в ссылке на объект.

и красная ошибка выделения в андроид-студии "unescaped and or non terminated character".

Итак, как я должен это исправить?

Edit: нашел ответ, этот символ должен быть экранирован:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'
4b9b3361

Ответ 1

&& должно отображаться как &amp;&amp; ,

Официальное руководство по привязке данных содержит примеры операторов сравнения, в которых используются, например, эти объекты XML.

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

редактировать

Примеры выражений, которые я упомянул в ответе, исчезли из англоязычной версии документа с момента написания этого ответа. Они выживают в некоторых устаревших неанглийских версиях документов, таких как испанская версия.

В любом случае, оригинальный ответ остается в силе, потому что использование XML-объектов в XML является стандартным в XML и не имеет ничего общего с самим Android.

Ответ 2

Экранирование && в разметке макета очень плохое решение. Лучше создать метод для объекта (вида) модели:

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

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

Ответ 3

Список объектов HTML

Вы не можете использовать & или некоторые другие объекты HTML в XML. Таким образом, вы должны использовать экранирующий символ.

android:text="@{(1==1 &amp;&amp; 2>0) ? 'true' : 'false'}"

Объекты символов HTML, часто используемые в Android:

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

Вот полный список объектов HTML.

Ответ 4

Лучшим решением, которое я мог бы решить для этой проблемы, является введение нового метода Bindable.

До:

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