Привязка данных 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:
нашел ответ, этот символ должен быть экранирован:
'&' --> '&'
'<' --> '<'
'>' --> '>'
Ответы
Ответ 1
&&
должно отображаться как &&
,
Официальное руководство по привязке данных содержит примеры операторов сравнения, в которых используются, например, эти объекты XML.
android:visibility="@{age < 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 && 2>0) ? 'true' : 'false'}"
Объекты символов HTML, часто используемые в Android:
+--------+----------------------------+--+--+--+
| Symbol | Equivalent HTML Entity | | | |
+--------+----------------------------+--+--+--+
| > | > | | | |
+--------+----------------------------+--+--+--+
| < | < | | | |
+--------+----------------------------+--+--+--+
| " | ", “ or ” | | | |
+--------+----------------------------+--+--+--+
| ' | ', ‘ or ’ | | | |
+--------+----------------------------+--+--+--+
| } | } | | | |
+--------+----------------------------+--+--+--+
| & | & | | | |
+--------+----------------------------+--+--+--+
| space |   | | | |
+--------+----------------------------+--+--+--+
Вот полный список объектов HTML.
Ответ 4
Лучшим решением, которое я мог бы решить для этой проблемы, является введение нового метода Bindable.
До:
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();
}