1

入力した値が0〜100の間であることを確認しようとしています。

だから私は私のフィルターを設定しました:

myTextView.setFilters(new InputFilter[]{ new InputFilterMinMax(0,100) });

チュートリアルWebサイトからのコードに基づいています。

ただし、フィールドの任意の場所に入力できることは考慮されていません。

別名、 90.9と入力してから、 戻って前に1を追加して190.9にすることができます...数値が90.91であると想定しています。

私は、、そして新しい文字列がどのように見えるかを決定することと関係があるend startdend考えています。dstart

誰かがこれを経験したことがありますか?

import android.text.InputFilter;
import android.text.Spanned;

public class InputFilterMinMax implements InputFilter {

    private int min, max;

    public InputFilterMinMax(int min, int max) {
        this.min = min;
        this.max = max;
    }

    public InputFilterMinMax(String min, String max) {
        this.min = Integer.parseInt(min);
        this.max = Integer.parseInt(max);
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {   
        try {
            Double input = Double.parseDouble(dest.toString() + source.toString());
            if (isInRange(min, max, input))
                return null;
        } catch (NumberFormatException nfe) { }     
        return "";
    }

    private boolean isInRange(int a, int b, Double c) {
        return b > a ? c >= a && c <= b : c >= b && c <= a;
    }
}
4

1 に答える 1

3

デバッガーとend、startなどの値で少し遊んだ後

私はこれを思いついた:

@Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {   
        try {
            String newString = dest.toString().substring(0, dstart) + source.toString().substring(start, end) + dest.toString().substring(dend);

            Double input;
            // If we only have one char and it is a minus sign, test against -1:
            if (newString.length() == 1 && newString.charAt(0) == '-')
                input = -1d;
            else
                input = Double.parseDouble(newString);

            if (isInRange(min, max, input))
                return null;
        } catch (NumberFormatException nfe) { }     
        return "";
    }

これにより、以前のソースと新しいソースがサブストリングになります。正しい場所でテキストを削除または追加して、テキストがどうなるかのプレビューを生成します(newString)。その後、通常どおりチェックを続行します。

これは、一度にすべてを削除するか、新しいテキストをコピーして貼り付ける場合に適用されます。それは、その前にある古いテキスト、挿入されたテキスト、そしてその後のテキストを決定します。

于 2013-03-26T16:22:53.797 に答える