Ниже приведен код, который я использую в тексте редактирования, чтобы принимать значение только в определенном диапазоне.

 EditText.setFilters(new InputFilter[]{ new InputFilterMinMax(Min, Max)});

Это моя функция:

 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) {
        int input = 0;
        try {
            input = Integer.parseInt(dest.toString() + source.toString());
            if (isInRange(min, max, input))
                return null;
        } catch (NumberFormatException nfe) {
        }
        return "";
    }

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

Этот код работает, когда min равно 1, а max равно 10, но он не работает, когда min 20, а max 30, пожалуйста, помогите, заранее спасибо

2
Vodle Manis 2 Янв 2018 в 11:01

2 ответа

Лучший ответ
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) {
        int input = 0;
        try {
            **if(end==1){
               min = Integer.parseInt(source.toString());
            }**
            input = Integer.parseInt(dest.toString() + source.toString());
            if (isInRange(min, max, input))
                return null;
            } catch (NumberFormatException nfe) {
        }
        return "";
    }

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

Добавление if (end==1) { min = Integer.parseInt(source.toString()); } мне подходит.

Однако лучший подход к тому, что вы пытаетесь реализовать, - использовать TextWatcher, как упоминалось Томасом

0
Edson Menegatti 2 Янв 2018 в 09:54

Это потому, что, когда вы начинаете набирать «20», первое число - 2, а 2 - не от 20 до 30.

Я предлагаю вам вместо этого использовать TextWatcher:

TextWatcher textWatcher = new TextWatcher() {

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

    }

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {

        if(s.length() > 0) {
            int num = Integer.parseInt(s);
            if (num >= Min && num <= Max)
            {
                // Place your logic here. EG : save the number.
            }
            else{
                // Your are not in the desired range. 
            }
        }
    }

    @Override
    public void afterTextChanged(Editable s) {

    }
};

EditText.addTextChangedListener(textWatcher);
0
Thomas Mary 2 Янв 2018 в 08:41