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'

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 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.

  • Android Switch Widget: Configuración de android: la pista hace que el pulgar y la pista no se muestren
  • Altura y peso de la disposición lineal
  • Escribir XML en Android
  • Cómo configurar la pantalla completa de XML en Android
  • Android - Creación de una imagen animada de tipo analógico para el movimiento
  • Cómo aumentar el tamaño de transport.dump de 256 bytes a 512 o más bytes en KSOAP2?
  • Android: cambiar el tamaño de la vista de la imagen en XML
  • @Namespace en Android SimpleXml
  • ListView OnItemClick listner no funciona en fragmento
  • Cómo envolver el fragmento GoogleMap en un LinearLayout?
  • Utilizar JAXB (xjc) clases generadas en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.