【问题标题】:How to combine these inputfilters for the EditText?如何为 EditText 组合这些输入过滤器?
【发布时间】:2016-11-08 17:22:26
【问题描述】:

我是安卓编程新手。我创建了一个材料应用程序,用户可以使用该应用程序跟踪他们的体重。 (附注)我有用于输入值的编辑文本。我已经尝试过制作两个输入过滤器,但它们无法正常工作:

它们的代码:

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

使用该代码,用户可以在小数点前输入任意数量的数字,但小数点后只能输入一个符号。例如:他可以输入145.6、2452.5、54356.5、34523423.5。

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

请帮我更改我的代码以完成这项工作

【问题讨论】:

    标签: android input android-edittext


    【解决方案1】:

    试试这个:

    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 个小数,并且您只能输入数字并且只能一个点一样多

    【讨论】:

    • 我有一个数字十进制编辑文本,我只能输入数字。为什么我需要 isNumber?
    • 错误:(130, 34) 错误: 找不到符号变量长度错误:(133, 38) 错误: 找不到符号变量长度错误:(144, 25) 错误: 找不到符号变量源错误:(144, 45) 错误:找不到适合 parseInt(CharSequence) 的方法
    • method Integer.parseInt(String,int) 不适用(实际参数列表和形式参数列表的长度不同) method Integer.parseInt(String) 不适用(实际参数 CharSequence 不能通过方法调用转换)错误:(144, 79)错误:找不到适合parseInt(CharSequence)方法的方法Integer.parseInt(String,int)不适用(实际和形式参数列表长度不同)
    • method Integer.parseInt(String) 不适用(实参CharSequence无法通过方法调用转换为String) :app:compileDebugJavaWithJavac FAILED
    • 对不起,我看到字符序列为字符串
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 2017-10-09
    • 1970-01-01
    • 2018-02-05
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多