Android Databinding: "Referencias de métodos con '.' es obsoleto"
Cuando utilizo enlace de datos en mi aplicación, recibo la siguiente advertencia al compilar:
Warning:Method references using '.' is deprecated. Instead of 'handler.onItemClick', use 'handler::onItemClick'
- Analizar xml de la respuesta httppost
- Plantilla xml de Nativescript que no soluciona problemas de caché
- Alinear el centro de texto con android
- Icono de elemento del cajón de navegación que no muestra el color original
- Error XML al agregar Google Analytics a mi aplicación
Por favor vea mi XML a continuación.
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="handler" type="ClickHandler"/> <variable name="active" type="boolean"/> </data> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:onClick="@{!active ? handler.onItemClick : null}" android:background="@color/backgroundWhite"/> </RelativeLayout> </layout>
Tenga en cuenta lo siguiente : de la declaración condicional
Mensaje bastante sencillo, hasta que cambie el '.' a '::'.
android:onClick="@{!active ? handler::onItemClick : null}"
Dado que onItemClick está dentro de una sentencia condicional, parece interpretar la primera de las dos :: 's como la sentencia' else 'de la condición. En el segundo ':', obtengo el error:
<expr> expected, got ':'
EDIT: Como @CommonsWare sugiere en los comentarios, invertir la sentencia a "@{active ? null : handler::onItemClick}"
tampoco ayuda, se muestra un error similar (ver comentarios)
EDIT2: Aparentemente, al quitar la sentencia condicional, dejándola con "@{handler::onItemClick}"
, todavía da un error: '!=', '%', '*', '+', ',', '-', '.', '/', <, <<, <=, '==', '>', '>=', '>>', '>>>' or '[' expected, got ':'
Usando la notación de puntos, todavía da una advertencia al compilar
¿Hay alguna manera de escapar de estos :: 's, por lo que se interpreta correctamente?
- Mi aplicación no está visible en Google Play Store para Samsung Galaxy Note 4
- Diseño de Android: apila dos TextViews verticalmente, dentro de una fila ListView
- Android: ¿Es posible usar string / enum en el selector drawable?
- Cómo poner un botón entre dos diseños
- Solicitud HTTP para archivo XML
- configurar el color de fondo en listview
- No se puede colocar la vista debajo de RecyclerView
- Andoird: Custom switch: Cómo hacer el pulgar más del 50% de una pista sin usar imágenes
Mi conjetura es que la advertencia de desaprobación se muestra porque Android Data Binding no está siendo totalmente compatible con Java 8. Poner lo siguiente en el archivo build.gradle
su proyecto debe ocultar la advertencia mencionada.
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_7 targetCompatibility JavaVersion.VERSION_1_7 } }
A menos que esté utilizando las características de Java 8 en su proyecto.
El error '::' es actualmente un error abierto para el editor de Android Studio xml.
Todavía puede utilizar JavaVersion.VERSION_1_8
. Simplemente utilice app:onClick
y defina un BindingAdapter como este:
@BindingAdapter("onClick") public static void bindOnClick(View view, final Runnable runnable) { view.setOnClickListener(v -> runnable.run()); }
A continuación, puede utilizar app:onClick="@{handler::onItemClick}"
sin advertencias ni errores.
No quería apagar Java 8 así que usé las expresiones lambda en enlace de datos en su lugar:
android:onClick="@{(v)->handler.onItemClick(v)}"
Aquí hay un artículo de George Mount que da muchos ejemplos.
Una cosa a tener en cuenta es que la expresión lambda está vinculada cuando el evento no ocurre en el momento de la encuadernación.
- Ciclo de vida de la clase de aplicación mientras se ejecuta el servicio
- Cómo implementar Flipboard ipad página de animación de giro para ver flipper en android?