Я думаю, было бы проще, если бы вы обрабатывали щелчки немного по-другому. Часть лямбда-выражения работает только в Android Studio 2.1 и выше.
<Button android:onClick="@{(view)->Handlers.increment(view, 10)}" .../>
<Button android:onClick="@{(view)->Handlers.decrement(view, 0)}" .../>
<TextView app:quantity="@{quantity}"/>
И тогда ваш класс обработчика имеет:
public static void increment(View view, int max) {
FragmentBinding binding = DataBindingUtil.findBinding(view);
binding.setQuantity(Math.max(max, binding.getQuantity() + 1));
}
public static void decrement(View view, int min) {
FragmentBinding binding = DataBindingUtil.findBinding(view);
binding.setQuantity(Math.min(min, binding.getQuantity() - 1));
}
В качестве альтернативы вы можете использовать полноценную двустороннюю привязку. В предстоящей Android Studio 2.2 вы сможете сделать это:
<Button android:onClick="@{()->Handlers.increment(quantityView, 10)}" .../>
<Button android:onClick="@{()->Handlers.decrement(quantityView, 0)}" .../>
<TextView android:id="@+id/quantityView" app:quantity="@={`` + quantity}"/>
И тогда ваш класс обработчика имеет:
private static int getCurrentIntValue(TextView view) {
try {
return Integer.parseInt(view.getText().toString());
} catch (NumberFormatException e) {
return 0;
}
}
public static void increment(TextView view, int max) {
int value = getCurrentIntValue(view);
binding.setQuantity(Math.max(max, value + 1));
}
public static void decrement(View view, int min) {
int value = getCurrentIntValue(view);
binding.setQuantity(Math.min(min, value - 1));
}
Трюк, добавленный в Android Studio 2.2, — это поддержка преобразований для конкатенации строк с пустой строкой. Это полезный ярлык. Без этого (Android Studio 2.1) вам нужно будет добавить собственную двустороннюю привязку для текста integer-to-TextView:
@InverseBindingAdapter(attribute = "quantity")
public static int getQuantity(TextView view) {
return getCurrentIntValue(view);
}
а вот упрощенный адаптер для привязки. Используйте один из TextViewBindingAdapter.java в качестве шаблона, если вам нужно добавить наблюдатели за текстом в тот же TextView:
@BindingAdapter("onQuantityChanged")
public static void setQuanityWatcher(TextView view,
final InverseBindingListener quantityChanged) {
TextWatcher newTextWatcher;
if (quantityChanged == null) {
newTextWatcher = null;
} else {
newTextWatcher = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
quantityChanged.onChange();
}
// others are empty...
}
}
TextWatcher oldTextWatcher = ListenerUtil.trackListener(
view, newTextWatcher, R.id.textWatcher);
if (oldTextWatcher != null) {
view.removeTextChangeListener(oldTextWatcher);
}
if (newTextWatcher != null) {
view.addTextChangedListener(newTextWatcher);
}
}
Обратите внимание, что я ничего из этого не компилировал, поэтому могут быть опечатки.
person
George Mount
schedule
06.05.2016