2016-05-19 18 views
13

Quando si utilizza l'associazione dati nella mia app, ottengo il seguente avviso quando si compila:Associazione dati Android: "Riferimenti al metodo usando '.' è deprecato"

Warning:Method references using '.' is deprecated. Instead of 'handler.onItemClick', use 'handler::onItemClick'

Si prega di vedere il mio XML di seguito.

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

prega di notare la : dal istruzione condizionale messaggio

piuttosto semplice, fino a quando cambio la '' a '::'.

android:onClick="@{!active ? handler::onItemClick : null}" 

Dal momento che l'onItemClick si trova all'interno di un'istruzione condizionale, sembra di interpretare il primo dei due :: 's come il '' else della condizione. Al secondo ':', ottengo l'errore:

<expr> expected, got ':'

EDIT: Come @CommonsWare suggerito nei commenti, invertendo la dichiarazione di "@{active ? null : handler::onItemClick}" non aiuta neanche, viene visualizzato un errore simile (vedi commenti)

EDIT2: a quanto pare, quando si spellano l'istruzione condizionale via, essere lasciato con "@{handler::onItemClick}", dà ancora un errore: '!=', '%', '*', '+', ',', '-', '.', '/', <, <<, <=, '==', '>', '>=', '>>', '>>>' or '[' expected, got ':' Utilizzando il dot-notation, dà ancora un avvertimento quando si compila

C'è un modo per sfuggire a questi :: s, quindi è interpretato correttamente?

+2

In questo caso, si potrebbe provare invertendo l'ordine come una soluzione: '@ {attivo? null: handler :: onItemClick} '. Altrimenti, sembra un bug nel supporto per l'associazione dei dati. – CommonsWare

+1

@CommonsWare: Purtroppo, che dà anche un errore, il primo dei due ::! 'S questa volta: '' = ' '%', '*', '+',', '' - '' ' '/', <, <<, <=, '==', '>', '> =', '>>', '>>>' o '[' previsto, ottenuto ':' ' – Marcel50506

+0

Phooey.. Se si riesce a creare un progetto di esempio che illustra l'errore, si potrebbe [inviare una segnalazione di bug] (https://code.google.com/p/android/issues/list). Non ne vedo uno là fuori per questo. Alla fine cercherò di riprodurlo da solo, se non hai la possibilità di presentare un problema. – CommonsWare

risposta

5

La mia ipotesi è che l'avviso deprecazione è mostrata in quanto i dati Android Binding attualmente non essere pienamente compatibile con Java 8. Mettere quanto segue nel file di build.gradle del progetto dovrebbe nascondere avvertimento menzionato.

android { 
    compileOptions { 
     sourceCompatibility JavaVersion.VERSION_1_7 
     targetCompatibility JavaVersion.VERSION_1_7 
    } 
} 

A meno che non si sta utilizzando Java 8 funzioni nel progetto.

1

È ancora possibile utilizzare JavaVersion.VERSION_1_8. Basta usare app:onClick, e definire un BindingAdapter come questo:

@BindingAdapter("onClick") 
public static void bindOnClick(View view, final Runnable runnable) { 
    view.setOnClickListener(v -> runnable.run()); 
} 

quindi è possibile utilizzare app:onClick="@{handler::onItemClick}" senza avvisi o errori.

1

Non volevo spegnere Java 8 quindi ho usato le espressioni lambda in associazione dati invece:

android:onClick="@{(v)->handler.onItemClick(v)}"

Here è un articolo di George monte che dà un sacco di esempi.

Una cosa da notare è che l'espressione lambda è vincolata quando l'evento si verifica non al momento del binding.

3

L'errore "::" è attualmente aperto bug per l'editor xml di Android Studio.

Problemi correlati