Android: 如何在InputFilter中处理退格键?

5
我为EditText组件创建了一个InputFilter,它只允许在一定范围内输入double类型的数字(例如从1.5到5.5)。一切都很顺利,直到我删除了小数点:
我输入了1.68,然后删除了小数点。文本框中的值变成了168,显然超出了范围。
以下是我的过滤器的简化版本:
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        if (isValid(dest.toString() + source.toString())) {
            //input is valid
            return null;
        }else{
          //The input is not valid
            return "";
        }
}
private boolean isValid(String input) {
    Double inputValue = Double.parseDouble(input);
    boolean isMinValid = (1.5 <= inputValue);
    boolean isMaxValid = (5.5 >= inputValue);

    return  isMinValid && isMaxValid;
}
3个回答

10

我解决了我的问题。以下是解决方案,以防其他人需要:

public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    if (isValid(dest.toString() + source.toString())) {
        //input is valid
        return null;
    }else{
      //The input is not valid
       if (source.equals("") && dest.toString().length() != 1) {
            //backspace was clicked, do not accept that change, 
            //unless user is deleting the last char
            CharSequence deletedCharacter = dest.subSequence(dstart, dend);
            return deletedCharacter;
        }
        return "";
    }

}


谢谢兄弟。这部分对我很有帮助 -> return dest.subSequence(dstart, dend); - Nayan

0
在我的情况下,我需要一个范围验证,比如说在0到500之间。
5 is ok
55 is ok
555 is Error

但是为了让用户更清楚,如果用户输入的数字以范围之外的数字结尾,我想显示最终数字和一条消息给用户(我正在使用Material TextInputLayout),但是退格键没有按预期工作。

你的解决方案给了我一个想法:

...
        try {
            val input = if (source.toString() != "") {
                Integer.parseInt(dest.toString() + source.toString())
            }
            else {
                Integer.parseInt(dest?.replaceRange(dstart, dend, source.toString()).toString())
            }
            if (isInRange(intMin, intMax, input)) {
                //Input Valido
                return null
            } else {
                //Input Invalido
                if (source.toString() == "" && dest.toString().length != 1) {
                    //return dest?.subSequence(dstart, dend)
                    return null
                }
                textInputLayout?.error = "Rango no válido!"
                return null //Deja el caracter, si devuelve "" no imprime el caracter
            }
        } catch (e: NumberFormatException) {
            e.printStackTrace()
        }

如果用户按下退格键,
source is ""
dest is the actual number, 555
and "dstart" and "dend" are the index to replace.(2 and 3)

至少对我来说它有效 最好的祝福


0

当您完成在编辑文本中输入数据后,您必须触发知道您已经完成输入数据并现在必须检查输入。

例如,通过添加输入测试按钮,或者例如当编辑文本字段失去焦点时。


那个方法可以行,但我想要自动化。我会很快发布解决方案。 - user2287966

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接