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';

  • Enlace de datos: enlaza método único de escucha con múltiples métodos
  • La vinculación de dos vías de Android con tipo entero hace que la conexión de datos no exista
  • No se encuentra el método de inflado para mi vinculación (mediante Android, vinculación de datos).
  • Utilizar la biblioteca DataBinding para establecer el recurso de color de fondo o null
  • Banda de datos Android @BindingConversion falla para int a cadena
  • Conexión de datos de Android con menús
  • Vinculación de datos - safeUnbox warning
  • El enlace de datos de Android no funciona con los atributos <merge>
  • 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.