Tôi phải thiếu cái gì đó ở đây. Mỗi ví dụ tôi đã thấy với liên kết 2 chiều của Android được dựa trên String
trong dữ liệu sao lưu cho bất kỳ điều gì mà người dùng có thể nhập, chẳng hạn như EditText
.Cách đúng số 2-ràng buộc số cho Android editText
Xử lý mọi thứ không phải là Chuỗi có vẻ hơi ... không phù hợp. Ví dụ, nếu tôi có một đôi trong mô hình miền của tôi cần phải chỉnh sửa được, thì ràng buộc tốt nhất mà tôi đã đưa ra yêu cầu là ViewModel
với rất nhiều mã để giao tiếp giữa mô hình và EditText
.
Tôi có thiếu khóa nào không? Tôi có thực sự cần 30 dòng mã để giao diện một số EditText
với số tăng gấp đôi không? Vì mục đích của cuộc thảo luận, chúng ta hãy xem xét một lĩnh vực tiền tệ, thể hiện dưới dạng một đôi, trong một hai chiều ràng buộc EditText
:
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:inputType="numberDecimal"
android:text="@={fragModel.startBucks}"
android:id="@+id/editText2"/>
và đây là ViewModel Tôi đã có để xây dựng nhằm cung cấp cho các EditText một chuỗi để liên kết với.
@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);
}
Ở đây, tôi đã viết a simple, compilable example of 2-way binding with a ViewModel. Nó minh họa những khó khăn mà tôi đã liên tục cập nhật một phao trong mô hình miền - cuối cùng, tôi quyết định không có cách nào để làm điều đó mà không cần viết một TextWatcher tùy chỉnh cho mỗi lĩnh vực tên miền.
Cảm ơn! Đó là một ví dụ hữu ích và thực tế, và có lẽ không có cách nào tốt hơn. Tuy nhiên, những gì tôi thực sự tìm kiếm là một cách thanh lịch và đơn giản để ràng buộc một phao vào một trường có mã tối thiểu. Nó có vẻ lạ với tôi rằng nó rất đơn giản để ràng buộc một chuỗi và rất phức tạp để ràng buộc một phao. –