2016-06-02 14 views
8

Mam pole ObservableBoolean w mojej klasie działalności, która jest związana z „zaznaczone” atrybutu z moich ToggleButton tak:Jak wykonać dwukierunkowe powiązanie danych za pomocą przycisku ToggleButton?

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

ja ufałem to byłoby stworzyć dwustronną relację między przyciskiem a boolean, ale przenosi tylko zmiany z pola na przycisk, a nie na odwrót. Co robię źle, czy to nie jest w zakresie Androida DataBinding?

Odpowiedz

18

Trzeba inny '=' powiedzieć Android, który chcesz użyć Two-Way wiązania z danymi:

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

można znaleźć więcej informacji na temat tej in the wordpress article of George Mount:

Two -Way Data Binding

Android nie jest odporny na typowe dane ry i często ważne jest, aby odzwierciedlić zmiany z danych wejściowych użytkownika z powrotem do modelu. Na przykład, jeśli powyższe dane znajdowały się w formularzu kontaktowym, byłoby miło, gdyby edytowany tekst został wepchnięty do modelu bez konieczności pobierania danych z EditText. Oto jak to zrobić:

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

Całkiem ładne, prawda? Jedyna różnica polega na tym, że wyrażenie jest oznaczone @={} zamiast @{}. Oczekuje się, że większość powiązań danych będzie nadal jednokierunkowa i nie chcemy, aby wszystkie te słuchacze tworzyły i obserwowały zmiany, które nigdy się nie wydarzą.

3

Nie musisz wykonywać ObservableBoolean, możesz wykonać tę operację za pomocą regularnej metody ustawiającej zmienną boolean. Tak jak w Twojej klasie modelu

public class User{ 
    private boolean checked; 

    public boolean isChecked() { 
     return checked; 
    } 

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

Wykonaj dwustronne wiązanie na twoim ToggleButton.

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

i pobrać tę wartość za pomocą zmiennej wiążącej.

binding.getUser().isChecked() 
+1

Brakuje adnotacji '@ Bindable' w swoim' isChecked() 'i' notifyPropertyChanged (BR.checked) 'w twoim ustawiaczu. – saiyancoder

+1

@saiyancoder Nie sądzę, że jest to konieczne –

Powiązane problemy