2016-06-02 20 views
8

私はそうのように私のToggleButtonの「確認」属性にバインドされている私の活動のクラスにObservableBooleanフィールドを持っている:ToggleButtonで双方向データバインディングを実行するにはどうすればよいですか?

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

私は、これはボタンとの間で双方向の関係を作成します期待していましたブール値ですが、フィールドからボタンへの変更だけを持ちます。何が間違っているのですか、これはAndroidの範囲にありませんDataBinding

答えて

18

あなたは必要とする別の '=' あなたは、双方向のデータバインディングを使用したいというのAndroidを伝えるために:

2:あなたはこのin the wordpress article of George Mountに関する詳細な情報を見つけることができます

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

を-Wayデータバインディング

Androidは一般的なデータユーザーの入力からの変更をモデルに反映させることが重要な場合があります。上記のデータは、接触型であった場合、例えば、それのEditTextからデータを取得することなく、バックモデルに押し込ま編集されたテキストがあると便利であろう。ここではあなたがそれを行う方法は次のとおりです。

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

かなり気の利いた、えっ?ここでの唯一の違いは、式が@={}の代わり@{}でマークされていることです。バインディング、ほとんどのデータは一方通行であり続けるだろうと私たちはこれらすべてのリスナーが作成され、決して起こらない変化を見ていたくないことが期待されます。

3

ObservableBooleanを取るする必要はありません、あなたはブール変数の定期的なゲッターセッターメソッドによって、この操作を行うことができます。このように、あなたのモデルクラスに

public class User{ 
    private boolean checked; 

    public boolean isChecked() { 
     return checked; 
    } 

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

は双方向があなたのToggleButtonに結合行います。

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

この値をバインディング変数を使用して取得します。

binding.getUser().isChecked() 
+1

あなたのセッターの 'isChecked()'と 'notifyPropertyChanged(BR.checked)'に '@ Bindable'アノテーションがありません。 – saiyancoder

+1

@saiyancoder私は必要とは思わない –

関連する問題