Mi manca qualcosa qui. Ogni esempio che ho visto con il bind a 2 vie di Android si basa su un valore String
nei dati di supporto per qualsiasi elemento immesso dall'utente, ad esempio EditText
.Come associare correttamente 2-way-bind ad Android editText
Maneggiare qualcosa che non sia una stringa sembra un po '... inelegante. Ad esempio, se ho un double nel mio modello di dominio che deve essere modificabile, la migliore associazione che ho trovato richiede uno ViewModel
con sorprendentemente un sacco di codice da interfacciare tra il modello e lo EditText
.
Mi manca qualcosa chiave? Dovrei davvero bisogno di 30 linee di codice per interfacciare un EditText
con un doppio? Per il bene della discussione, prendiamo in considerazione un campo di valuta, rappresentato come un doppio, in un doppio senso legato EditText
:
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:text="@={fragModel.startBucks}"
android:id="@+id/editText2"/>
Ed ecco il ViewModel ho avuto di costruire al fine di dare l'EditText una stringa legare a
@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);
}
Ecco, ho scritto a simple, compilable example of 2-way binding with a ViewModel. Illustra la difficoltà che ho avuto nell'aggiornare continuamente un float nel modello di dominio - alla fine, ho deciso che non c'è modo di farlo senza scrivere un TextWatcher personalizzato per ogni dominio.
Grazie! Questo è un esempio utile e realistico e probabilmente non esiste un modo migliore. Tuttavia, quello che cerco davvero è un modo elegante e semplice per legare un float a un campo con un codice minimo. Mi sembra strano che sia così semplice legare una stringa e così complessa da legare un galleggiante. –