簡體   English   中英

具有數據綁定的Android中的布局綁定整數值限制從0到10

[英]Layout Binding integer value limit from 0 to 10 in android with databinding

我試圖借助數據綁定在android中設置一個最小值為0且最大值為10的整數的限制。 為此,我有一個可綁定的適配器,它用兩個偵聽器設置一個整數的值,一個增加該值,另一個減小它。 現在我終於要設置該整數的極限,最小值為0,最大值為10。

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

我認為如果您對點擊次數進行一些不同的處理會更容易。 lambda表達式部分僅適用於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中添加的技巧是支持將字符串串聯轉換為空字符串。 這是一個有用的快捷方式。 否則,您需要為整數到TextView文本添加自己的雙向綁定:

@InverseBindingAdapter(attribute = "quantity")
public static int getQuantity(TextView view) {
    return getCurrentIntValue(view);
}

這是一個簡化的綁定適配器。 如果需要將文本監視程序添加到同一TextView中,請使用TextViewBindingAdapter.java中的一個作為模板:

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

請注意,我尚未對此進行任何編譯,因此可能存在拼寫錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM