EditText输入过滤器导致字母重复

6

我一直使用以下方法限制edittext中的输入;

InputFilter filter = new InputFilter() { 
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            String output = "";
            for (int i = start; i < end; i++) {
                if (source.charAt(i)!='~'&&source.charAt(i)!='/') {
                    output += source.charAt(i); 
                }
            } 
            return output;
        }
    };

然而,任何使用这种方法的人都会发现,当它与自动更正和退格键混合使用时,会导致重复字符。为了解决这个问题,我从键盘中移除了自动更正栏,如下所示:

Edittect.setInputType(InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS);

现在这个功能在原生的安卓键盘上运行良好,但问题在于在其他(来自谷歌商店)的键盘上不会禁用自动纠正,因此我又遇到了重复字符的问题。有人遇到过这种情况/知道如何解决吗?

这应该会对你有所帮助。https://dev59.com/tWgv5IYBdhLWcg3wMNwU?rq=1 - KMDev
@KMDev - 是的,它应该可以,问题是,我发现对于那个问题最有帮助的答案是我的!(使用上面的解决方案);) - jcw
2个回答

5

编辑 - 这个方法并不完美。在一些设备上(似乎大部分是三星手机),重复输入的问题会稍微减少,但仍然存在严重的问题。

强烈建议寻找另一种限制输入的方式,因为当前的输入筛选器存在一些严重问题。

我建议采取以下措施:

  • 使用android:digits xml属性
  • 在需要时检查edittext的内容,而不是在输入时
  • 可以尝试使用文本监听器,但我发现这样效果不佳 - 如果您找到了使用文本监听器的解决方案,请告诉我。

最终我解决了这个问题 - 我使用了下面的方法:

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

    if (source instanceof SpannableStringBuilder) {
        SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
        for (int i = end - 1; i >= start; i--) { 
            char currentChar = source.charAt(i);
             if (currentChar=='/' || currentChar=='~') {    
                 sourceAsSpannableBuilder.delete(i, i+1);
             }     
        }
        return source;
    } else {
        StringBuilder filteredStringBuilder = new StringBuilder();
        for (int i = 0; i < end; i++) { 
            char currentChar = source.charAt(i);
            if (currentChar != '~'|| currentChar != '/') {    
                filteredStringBuilder.append(currentChar);
            }     
        }
        return filteredStringBuilder.toString();
    }
}
}

3
在一些三星设备上,xml文件中的android:digits无法正常工作。在这种情况下,您可以尝试使用android:inputType="textVisiblePassword"来禁用自动完成,因为这是真正的问题所在。这可能不是正确的方法,但它确实有效。干杯! - Martino Lessio
2
啊,三星。每个安卓工程师的噩梦。 - Melllvar

2

在您的XML中的EditText中使用此代码以解决此问题:

android:inputType="textFilter"

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