привязка данных 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: нашел ответ, эти символы должны быть экранированы:

'&' --> '&'

'<' --> '&lt;'

'>' --> '&gt;'
4 62

4 ответа:

&& должны быть представлены как &amp;&amp;.

чиновник руководство по привязке данных имеет примеры операторов сравнения, где используются эти XML-объекты, например

android:visibility="@{age &lt; 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 &amp;&amp; 2>0) ? `true` : `false`}"

Это HTML-символьная сущность, часто используемая в Android:

> can be replaced with &gt;
< can be replaced with &lt;
" can be replaced with &quot;, &ldquo; or &rdquo;
' can be replaced with &apos;, &lsquo; or &rsquo;
} can be replaced with &#125;
& can be replaced with &amp;
space can be replaced with &#160;

здесь - это полный список объектов HTML.

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

перед:

item_recyclerview.xml:

<EditText
...
android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !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();
}