Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Android databinding usando operador lógico "&&"

Estoy tratando de utilizar el operador y "&&" en xml con Android databinding,

android:visibility="@{(bean.currentSpaceId == bean.selectedSpaceId **&&** bean.currentSpaceId > 0)? View.VISIBLE: View.GONE}"

Pero tengo el error de compilación:

Error: Error de ejecución para la tarea ': app: dataBindingProcessLayoutsDevDebug'. Org.xml.sax.SAXParseException; SystemId: file: /Users/path/app/build/intermediates/res/merged/dev/debug/layout/fragment_space.xml; LineNumber: 106; ColumnNumber: 89; El nombre de entidad debe seguir inmediatamente a '&' en la referencia de entidad.

Y error de resaltado rojo en android studio "sin escapar y / o carácter no terminado".

Entonces, ¿cómo debo solucionar esto?

Editar: encontró la respuesta, estos personajes deben ser escapados:

'&' -> '& amp';

'<' -> '& lt';

'>' -> '& gt';

3 Solutions collect form web for “Android databinding usando operador lógico "&&"”

&& debe mostrar como &amp;&amp; .

La guía oficial de vinculación de datos tiene ejemplos de operadores de comparación donde se utilizan estas entidades XML, por ejemplo

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

Escapar && en el marcado de maquetación es una solución muy pobre. Es mejor crear un método en el objeto de modelo (view):

 android:visibility="@{user.adult ? View.VISIBLE : View.GONE}" public boolean isAdult() { return age >= 18; } 

La mejor solución que podría dar con este problema fue la introducción de un nuevo método Bindable.

Antes de:

item_recyclerview.xml :

 <EditText ... android:enabled="@{myViewModel.myDataModelClass.lastAddedItem &amp;&amp; !myViewModel.myDataModelClass.editTextDisabled}" /> 

MyDataModelClass : (que se está celebrando en mi 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); } 

Después:

item_recyclerview.xml :

 <EditText ... android:enabled="@{myViewModel.myDataModelClass.enableEditing}" /> 

MyDataModelClass : (que se está celebrando en mi 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(); } 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.