einstellen Ich denke, es wäre einfacher, wenn Sie die Klicks ein wenig anders handhaben. Der Lambda-Ausdruck funktioniert nur in Android Studio 2.1 und höher.
<Button android:onClick="@{(view)->Handlers.increment(view, 10)}" .../>
<Button android:onClick="@{(view)->Handlers.decrement(view, 0)}" .../>
<TextView app:quantity="@{quantity}"/>
und dann Handler-Klasse hat:
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));
}
Alternativ können Sie auch ausgewachsene Zwei-Wege-Bindung verwenden. In dem kommenden Android Studio 2.2, werden Sie in der Lage sein, dies zu tun:
<Button android:onClick="@{()->Handlers.increment(quantityView, 10)}" .../>
<Button android:onClick="@{()->Handlers.decrement(quantityView, 0)}" .../>
<TextView android:id="@+id/quantityView" app:quantity="@={`` + quantity}"/>
und dann Handler-Klasse hat:
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));
}
Der Trick hinzugefügt im Android Studio 2.2 ist die Unterstützung für die Conversions für String-Verkettung mit leerer Zeichenfolge. Es ist eine nützliche Abkürzung. Ohne diese (Android Studio 2.1), müssen Sie Ihre eigene Zwei-Wege-Bindung für Integer-to-Textview Text hinzuzufügen:
@InverseBindingAdapter(attribute = "quantity")
public static int getQuantity(TextView view) {
return getCurrentIntValue(view);
}
und hier ist ein vereinfachtes Bindungsadapter. Verwenden Sie die man in TextViewBindingAdapter.java als Vorlage, wenn Sie Text-Beobachter auf den gleichen Textview hinzufügen müssen:
@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);
}
}
Bitte beachte, dass ich habe nichts davon zusammengestellt, so kann es Tippfehler sein.
msg: Bezeichner müssen benutzerdefinierte Typen aus der XML-Datei haben. Ansicht fehlt **** \ Datenbindungsfehler **** –
Das bedeutet, dass Sie "Bezeichner" verwenden, ohne den Typ zu importieren. –
Ich importierte die Ansicht aber es zeigt immer noch den Fehler. Importieren Sie die richtige Ansicht –