привязка данных android с помощью логического оператора" & &
Я пытаюсь использовать оператор and "& & " в xml с помощью привязки данных Android,
android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"
но я получил ошибку компиляции:
ошибка: не удалось выполнить задачу': app: dataBindingProcessLayoutsDevDebug'. орг.XML.саксофон.SAXParseException; systemId: файл:/пользователи/путь/приложение/сборка/полуфабрикатов/РЭС/слили/разработки/отладки/макет/fragment_space.xml; lineNumber: 106; columnNumber: 89; имя сущности должно немедленно следовать за ' & ' в сущности ссылка.
и красная ошибка выделения в Android studio "unescaped & or non terminated character".
Так как я должен это исправить?
Edit: нашел ответ, эти символы должны быть экранированы:
'&' --> '&'
'<' --> '<'
'>' --> '>'
4 ответа:
&&
должны быть представлены как&&
.чиновник руководство по привязке данных имеет примеры операторов сравнения, где используются эти XML-объекты, например
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
экранирование && в разметке макета является очень плохим решением. Лучше создать метод на объекте модели (view):
android:visibility="@{user.adult ? View.VISIBLE : View.GONE}" public boolean isAdult() { return age >= 18; }
чуть больше информации.
как вы должны знать, вы не можете использовать просто & или какой-нибудь HTML entity в XML.
таким образом, вы должны использовать экранирующий символ.
android:text="@{(1==1 && 2>0) ? `true` : `false`}"
Это HTML-символьная сущность, часто используемая в Android:
> can be replaced with > < can be replaced with < " can be replaced with ", “ or ” ' can be replaced with ', ‘ or ’ } can be replaced with } & can be replaced with & space can be replaced with  
здесь - это полный список объектов HTML.
лучшим решением, которое я мог придумать для этой проблемы было внедрение нового метода привязки.
перед:
item_recyclerview.xml
:<EditText ... android:enabled="@{myViewModel.myDataModelClass.lastAddedItem && !myViewModel.myDataModelClass.editTextDisabled}" />
MyDataModelClass
: (который проводится в моем viewmodel)... 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
: (который проводится в моем viewmodel)... 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(); }