如何为EditText组合这些输入过滤器?

时间:2016-11-08 17:22:26

标签: android input android-edittext

我是android编程的新手。我创建了一个材料应用程序,用户可以跟踪他们的重量。 (P.S)我有用于输入值的edittext。我已经尝试制作两个输入过滤器,但它们无法正常工作:

他们的代码:

editText.setFilters(new InputFilter[] {new InputFilterMinMax(1,140)});
editText.setFilters(new InputFilter[] {new DecimalDigitsInputFilter(1)});

public class DecimalDigitsInputFilter implements InputFilter {

private final int decimalDigits;

/**
 * Constructor.
 *
 * @param decimalDigits maximum decimal digits
 */
public DecimalDigitsInputFilter(int decimalDigits) {
    this.decimalDigits = decimalDigits;
}

@Override
public CharSequence filter(CharSequence source,
                           int start,
                           int end,
                           Spanned dest,
                           int dstart,
                           int dend) {


    int dotPos = -1;
    int len = dest.length();
    for (int i = 0; i < len; i++) {
        char c = dest.charAt(i);
        if (c == '.' || c == ',') {
            dotPos = i;
            break;
        }
    }
    if (dotPos >= 0) {

        // protects against many dots
        if (source.equals(".") || source.equals(","))
        {
            return "";
        }
        // if the text is entered before the dot
        if (dend <= dotPos) {
            return null;
        }
        if (len - dotPos > decimalDigits) {
            return "";
        }
    }

    return null;
}

}
public class InputFilterMinMax implements InputFilter {

private int min, max;

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

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    try {
        int 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;
}
}

使用该代码,用户可以根据需要在小数点前输入任意数字,但小数点后只能输入一个符号。 E. g。:他可以输入145.6,2452.5,54356.5,34523423.5。

我想允许用户只输入小数点前的数字1-140,但小数点后只能输入一个符号:86.5,45.7,99.9,112.4,140.0。

请帮我改变我的代码

1 个答案:

答案 0 :(得分:0)

试试这个:

InputFilter NumberDecimalFilter = new InputFilter() {
                        public CharSequence filter(CharSequence source, int start, int end,
                                Spanned dest, int dstart, int dend) {
                            int dots = 0;
                            int numbersAfterDot = 0;
                            for (int i = start; i < end; i++) {
            if (!Character.isDigit(source.charAt(i)) && source.charAt(i) != '.')  {
                return "";
            }else{
                if(source.charAt(i) == '.'){
                    if(dots > 0 || i == 0){
                      return "";
                    }else{
                       dots ++;
                    }
                }else{
                if(dots > 0 && numbersAfterDot > 0){
                      return "";
                    }else{
                       if(dots > 0){
                          numbersAfterDot ++;
                       }
                    }
                }
            }
        }
        return null;  
                    };  

    editText.setFilters(new InputFilter[] { NumberDecimalFilter });

检查小数部分的范围和大小我建议你使用edittext.gettext()。toString和Double.parseDouble()但是你不能输入超过1的小数而你只能输入数字而且只能输入数字一点一点