2017-08-12 17 views

答えて

3

The Busy Coder's Guide to Android Developmentから、自分自身を引用:

双方向結合作品をうまく 方法は、あなたが関連付けられているウィジェットのゲッターとセッター でアップだけでなくモデルラインにデータを格納する場合に。 CompoundButtonbooleanを受け入れbooleansetChecked() を返す isChecked()方法を持っているとして、SwitchようCompoundButtonのcheckedプロパティ でうまく動作 モデルでbooleanフィールド。

BindingAdapterを使用すると、データと のタイプとプロパティの間に他のマッピングを作成できますが、従来のモデル - >ビューバインディングの場合にのみ使用できます。 同じことを逆の方向に行うには、 をInverseBindingAdapterにします。この名前からわかるように、 はBindingAdapterと同じ基本的な役割を果たしますが、逆方向には というデータをウィジェットから取り出し、カスタム コードを使用してモデル用に準備します。ここで、「モデル用に準備する」とは、 モデルの場合、セッターのデータタイプを 、Observableフィールドに変換することを意味します。

これはかなり珍しいことです。

一部の場所で使用されている例は、「 floatEditTextに結び付けたいのですが? InverseBindingAdapter は次のようになります:

@InverseBindingAdapter(attribute = "android:text") 
public static float getFloat(EditText et) { 
    try { 
    return(Float.parseFloat(et.getText().toString())); 
    } 
    catch (NumberFormatException e) { 
    return(0.0f); // because, um, what else can we do? 
    } 
} 

問題がある場合snicklefritzのように、有効な 浮動小数点数ではない何かでユーザーの種類。 parseFloat()は でNumberFormatExceptionと失敗します。 は、のデータ入力が無効であることをユーザーに知らせる必要があります。ただし、双方向データバインディングでは がサポートされていません。代わりにデフォルト値(0.0f)がモデル に渡されます。だから、

、あなたの質問に答えるために:

2つの違いは何ですか?

BindingAdapterデータ型とViewセッターは、データバインディングが独自に処理する方法を知っているものではない性質を取り込むことができます。

InverseBindingAdapterは、データ型とViewゲッターがデータバインディングでどのように処理するかを知っているものではない、双方向バインディングでビューモデルを作成するのに役立ちます。

いつどちらか一方を使用する必要がありますか? BindingAdapterを定義するとき、逆を作成する必要がありますか?

ご希望のデータの種類(例えば、float)は、必ずしもデータバインディングは、ウィジェットのプロパティ(例えば、EditTextandroid:text)に記入する方法を知っているものではありませんが、あなたはそれをバインドしたいときBindingAdapterを使用しますとにかく

あなたはUIでユーザーの変更が自動的にビューモデルを更新ところ、はあなたが双方向結合をしたい、それを行う場合は、最も可能性の高いあなたは、例えば(プロパティから変換するには、一致InverseBindingAdapterが必要になりますEditTextのテキスト)を所望のデータタイプ(例えば、float)に変換する。

+0

非常に有益な回答、ありがとうございます! –

関連する問題