2016-06-02 31 views
8

Ho un campo ObservableBoolean nella mia classe di attività, che è legato all'attributo "controllato" del mio ToggleButton in questo modo:Come eseguire l'associazione dati bidirezionale con un ToggleButton?

android:checked="@{activity.editing}" 

Speravo che questo creerebbe un rapporto a due vie tra il pulsante e il booleano, ma porta solo le modifiche dal campo al pulsante, non viceversa. Che cosa sto sbagliando o non si tratta di Android DataBinding?

risposta

18

È necessario un altro '=' a dire Android che si desidera utilizzare bidirezionale associazione dati:

android:checked="@={activity.editing}" 

Potete trovare ulteriori informazioni su questo in the wordpress article of George Mount:

Two -Way Data Binding

Android non è immune ai dati tipici ry ed è spesso importante riflettere i cambiamenti dall'input dell'utente nel modello. Ad esempio, se i dati sopra riportati erano in un modulo di contatto, sarebbe bello avere il testo modificato reinserito nel modello senza dover estrarre i dati da EditText. Ecco come si fa:

<layout ...> 
    <data> 
     <variable type="com.example.myapp.User" name="user"/> 
    </data> 
    <RelativeLayout ...> 
     <EditText android:text="@={user.firstName}" .../> 
    </RelativeLayout> 
</layout> 

piuttosto carino, eh? L'unica differenza è che l'espressione è contrassegnata con @={} anziché @{}. Si prevede che la maggior parte dei dati vincolanti continueranno a essere a senso unico e non vogliamo che tutti questi ascoltatori creino e guardino per cambiamenti che non avverranno mai.

3

Non è necessario prendere ObservableBoolean, è possibile eseguire questa operazione con il metodo getter-setter regolare della variabile booleana. Ti piace questa nella tua classe del modello

public class User{ 
    private boolean checked; 

    public boolean isChecked() { 
     return checked; 
    } 

    public void setChecked(boolean checked) { 
     this.checked = checked; 
    } 
} 

eseguire due vie vincolante sul ToggleButton.

<ToggleButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:checked="@={user.checked}"/> 

e recuperare questo valore utilizzando la variabile di associazione.

binding.getUser().isChecked() 
+1

Si manca l'annotazione '@ Bindable' nel proprio' isChecked() 'e' notifyPropertyChanged (BR.checked) 'nel proprio setter. – saiyancoder

+1

@saiyancoder Non penso sia necessario –