2016-08-16 10 views
2

Android DatabindingLongの値を使用しようとしていますが、それを動作させることができません。これは私が試したすべてです。Androidデータバインディングで長い値を使用する

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}"を削除する必要がありました:=Equal Operatorを使用してandroid:text="@={String.valueOf(outlet.capacity)}"にすべてandroid:addTextChangedListener="@{outlet.onCapacityChange}"を変更した後、双方向バインディングがデフォルトで提供されているので。

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をチェックし、それをすべて初期化しました。しかし、それだけでそのせいで

答えて

1

あなたが結合双方向のためString.valueOf(outlet.capacity)のようなものを使用することができ、私は思ういけないcapacityAsStringはStringObservableField<String>) であり、このandroid:text="@={outlet.capacityAsString}"を試してみてくださいを構築していないでしょう。

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

それは完璧に動作しますが、あなたはのEditTextのためandroid:inputType="number"を設定する必要があります。あなたは2ウェイバインディングを実行している場合

1

それはあなたが長い値を結合双方向を行うことができないということではありませんが、ここでの問題は、あなたがStringlongを変換しているが、String値を受け入れますandroid:textですが、直接的な値は次のようになりますString

これは、モデルクラスではなく、ObservableField<String>としてください。

関連する問題