2016-08-16 39 views
2

我试图在Android Databinding中使用Long值,但无法使其正常工作。这是我试过的一切在Android数据绑定中使用Long值

1:这工作正常。在我开始测试棒棒糖前,我开始遇到崩溃。我不得不从XML

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: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); 
} 

我的项目不会因此建立。我不知道为什么?我检查了空,初始化它和所有。但是,它不会只是构建因为如此

回答

1

试试这个android:text="@={outlet.capacityAsString}",其中capacityAsString是StringObservableField<String>) 我不认为,你可以使用像String.valueOf(outlet.capacity)为双向绑定。

EDITED:真的,有使用类似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; 
    } 
} 

它完美,但你需要设置android:inputType="number"为您的EditText。

1

这并不是说你不能执行双向长值结合,但这里的问题是android:text接受String值,但要转换longString,但如果执行的是双向绑定,直接值应为String

最简单的解决方案是,在模型类中取ObservableField<String>而不是long。