2016-08-16 2 views
2

Я пытаюсь использовать значение Long в Android Databinding, но просто не могу заставить его работать. Это все, что я пробовалИспользование Long Value в Android Databinding

1: Это сработало отлично. Пока я не начал тестирование на pre-lollipop, и я начал испытывать сбои. Я должен был удалить этот android:addTextChangedListener="@{outlet.onCapacityChange}" из 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: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 является String (ObservableField<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 значения, хотя вы конвертируете long в String, но если вы выполняете двухстороннее связывание, прямое значение должно быть String.

Простейшее решение для этого было бы, возьмите ObservableField<String> в вашем классе модели, а не в длину.

Смежные вопросы