ここで何かを紛失しているはずです。 Androidの双方向バインディングで見たすべての例は、EditText
のように、ユーザーが入力できるもののバッキングデータに基づいてString
に基づいています。数字をAndroidに正しく2ウェイバインドする方法editText
文字列ではないものを扱うのはやや控えめです。たとえば、私のドメインモデルで編集可能にする必要がある場合、私が思い付いた最良のバインディングは、ViewModel
と、モデルとEditText
の間のインターフェイスに驚くほど多くのコードを必要とします。
何かキーがありませんか? EditText
をダブルでインターフェイスするには、30行のコードが本当に必要ですか?議論のために、のはEditText
バインド双方向で、二重のように表さ、通貨フィールドを考えてみましょう:
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:text="@={fragModel.startBucks}"
android:id="@+id/editText2"/>
そして、ここで私はのEditTextにする文字列を与えるために構築しなければならなかったのViewModelです縛る
@Bindable private String startBucksString;
private double localBucks;
public String getStartBucksString() {
double domainBucks = cd.getStartBucks();
// Ignore incoming change of less than rounding error
if(Math.abs(localBucks - domainBucks) < .001 ) return startBucksString;
startBucksString = "";
if(domainBucks != 0)
startBucksString = String.format("$%.2f", domainBucks);
return startBucksString;
}
public void setStartBucksString(String inBuckstr) {
double calcBucks=0;
inBuckstr = inBuckstr.replaceAll("[^\\d.]", "");
try {
calcBucks = Double.parseDouble(inBuckstr);
} catch(NumberFormatException e) {
return;
}
// Neglect outgoing change of less than rounding error
if(Math.abs(localBucks - calcBucks) < .001 ) return;
startBucksString = String.format("$%.2f", calcBucks);
localBucks = calcBucks;
cd.setStartBucks(calcBucks);
notifyPropertyChanged(BR.startBucksString);
}
ここでは、a simple, compilable example of 2-way binding with a ViewModelと書きました。これは、ドメインモデルでフロートを継続的に更新する際の難しさを示しています。結局、各ドメインフィールド用のカスタムTextWatcherを作成せずにそれを行う方法はないと判断しました。
ありがとうございます!それは有用で現実的な例であり、おそらくもっと良い方法はありません。しかし、私が本当に探しているのは、フロートを最小限のコードでフィールドにバインドするエレガントでシンプルな方法です。ストリングを束縛するのはとても簡単で、フロートを束縛するほど複雑なことは私には奇妙に思えます。 –