0

Ich versuche, die Grenze einer ganzen Zahl mit einem minimalen Wert von 0 und maximal 10 in android mit Hilfe von Datenbindung. Dafür habe ich einen bindefähigen Adapter, der den Wert einer ganzen Zahl mit zwei Listener setzen, den Wert erhöhen und den anderen verringern. Nun endlich wollte ich die Grenze dieser ganze Zahl, mindestens 0 und maximal 10.Layout Binding Integer Wert Grenze von 0 bis 10 in android mit Datenbindung

@BindingAdapter("quantity") 
public static void setQuantityText(TextView textView, int quantity) { 
    textView.setText(String.valueOf(quantity)); 
} 
public static class ListenerIncrease implements View.OnClickListener { 

    private FragmentBinding binding; 

    public ListenerIncrease(FragmentBinding binding) { 
     this.binding = binding; 
    } 

    @Override 
    public void onClick(View v) { 
     int quantity = binding.getQuantity(); 
     binding.setQuantity(++quantity); 
    } 
} 
public static class ListenerDecrease implements View.OnClickListener { 

    private FragmentBinding binding; 

    public ListenerDecrease(FragmentBinding binding) { 
     this.binding = binding; 
    } 
    @Override 
    public void onClick(View v) { 
     int quantity = binding.getQuantity(); 
     binding.setQuantity(--quantity); 
    } 
} 

Antwort

0

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.

+0

msg: Bezeichner müssen benutzerdefinierte Typen aus der XML-Datei haben. Ansicht fehlt **** \ Datenbindungsfehler **** –

+0

Das bedeutet, dass Sie "Bezeichner" verwenden, ohne den Typ zu importieren. –

+0

Ich importierte die Ansicht aber es zeigt immer noch den Fehler. Importieren Sie die richtige Ansicht –

Verwandte Themen