标签:android android-databinding
我试图在Android数据绑定中使用Long值,但是,无法让它工作.这是我尝试过的一切
1:这很好.直到我开始测试前棒棒糖,我开始遇到崩溃.我不得不从XML中删除这个android:addTextChangedListener =“@ {outlet.onCapacityChange}”
Java
@SerializedName("capacity")
@Expose
Long capacity
/**
*
* @return
* The capacity
*/
@Bindable
public Long getCapacity() {
return capacity;
}
/**
*
* @param capacity
* The capacity
*/
public void setCapacity(Long capacity) {
setAtomicCapacity(capacity);
Log.e(TAG+"Capacity", "" + capacity);
notifyPropertyChanged(BR.capacity);
}
public void setAtomicCapacity(Long basic) {
this.capacity = basic;
}
public TextWatcher onCapacityChange = new SimpleTextWatcher() {
@Override
public void onTextChanged(String newValue) {
Log.e(TAG+"Capacity", newValue);
setAtomicCapacity(Long.valueOf(newValue));
}
};
XML
<EditText
android:id="@+id/outletStockCapacity"
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_marginBottom="16dp"
android:inputType="number"
android:text='@{outlet.capacity != null ? String.valueOf(outlet.capacity) : ""}'
android:addTextChangedListener="@{outlet.onCapacityChange}"
android:singleLine="true"
android:imeOptions="actionNext"/>
2:将所有android:addTextChangedListener =“@ {outlet.onCapacityChange}”更改为android:text =“@ = {String.valueOf(outlet.capacity)}”使用= Equal Operator,因为默认情况下现在提供双向绑定.
Java
@SerializedName("capacity")
@Expose
Long capacity = 0L;
/**
*
* @return
* The capacity
*/
@Bindable
public Long getCapacity() {
return capacity;
}
/**
*
* @param capacity
* The capacity
*/
public void setCapacity(Long capacity) {
setAtomicCapacity(capacity);
Log.e(TAG+"Capacity", "" + capacity);
notifyPropertyChanged(BR.capacity);
}
public void setAtomicCapacity(Long basic) {
this.capacity = basic;
}
XML
<EditText
android:id="@+id/outletStockCapacity"
android:layout_width="match_parent"
android:layout_height="55dp"
android:layout_marginBottom="16dp"
android:inputType="number"
android:text="@={String.valueOf(outlet.capacity)}"
android:singleLine="true"
android:imeOptions="actionNext"/>
第一个在Post Lollipop上运行正常但是没有在Pre-Lollipop上工作.这是我的SimpleTextWatcher
public abstract class SimpleTextWatcher implements TextWatcher {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void afterTextChanged(Editable s) {
onTextChanged(s.toString());
}
public abstract void onTextChanged(String newValue);
}
我的项目不会因此而建立.我不知道为什么?我检查了null,初始化它和所有.但是,它不仅仅是因为这个而建立的
解决方法:
试试这个android:text =“@ = {outlet.capacityAsString}”,其中capacityAsString是String(ObservableField< String>)
我不认为,你可以使用像String.valueOf(outlet.capacity)这样的东西进行双向绑定.
编辑:真的,有一种方法可以使用android:text =“@ = {outlet.capacityAsLong}”之类的东西,但你必须编写自定义的@InverseBindingAdapter:
public class MyEditTextBindingAdapters {
@BindingConversion
public static String longToStr(Long value) {
return value != null ? String.valueOf(value) : "";
}
@InverseBindingAdapter(attribute = "android:text", event = "android:textAttrChanged")
public static Long captureLongValue(EditText view) {
long value = 0;
try {
value = Long.parseLong(view.getText().toString());
} catch (NumberFormatException e) {
e.printStackTrace();
}
return value;
}
}
它工作得很好,但你需要为你的EditText设置android:inputType =“number”.
标签:android,android-databinding 来源: https://codeday.me/bug/20190623/1267935.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。