【问题标题】:InputFilter removes whole textInputFilter 删除整个文本
【发布时间】:2020-02-25 11:32:53
【问题描述】:

我输入了 3 个字母字符 android 清除输入。我希望删除最后一个,第三个字符,而不是全文

更新,删除了关于下面评论的正则表达式,结果仍然相同

private final Integer mAlphabetCount = 2;

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

    String text = createResultString(source, start, end, dest, dstart, dend);

    if (text.length() <= mAlphabetCount) {
        for (int i = start; i < end; i++) {
            if (!Character.isLetter((source.charAt(i)))) {
                return "";
            }
        }
        return null;
    }

    char[] digit = text.substring(2).toCharArray();
    for (char c : digit) {
        if (!Character.isDigit(c)) {
            return "";
        }
    }

    return source;
}

private String createResultString(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    String sourceString = source.toString();
    String destString = dest.toString();
    return destString.substring(0, dstart) + sourceString.substring(start, end) + destString.substring(dend);
}

【问题讨论】:

    标签: android regex input-filtering


    【解决方案1】:

    更新

    首先,您需要决定在用户​​输入错误的情况下要发生什么。例如,用户已经输入“AB”,现在尝试输入“C”。你想丢弃“C”吗?您希望输入字段变为“BC”吗?假设您要丢弃“C”。

    检查source 是否是Spanned 的一个实例。如果是这样,那么如果输入无效,那么您不能只发回一个空字符串,否则它将删除文本框(现在正在发生这种情况)。您需要从source 中提取正确的部分并将其发回。由于我们决定只丢弃前 2 个之后的所有字母,因此您可以尝试将 source^([a-zA-Z]{0,2})(?:[^\d]*)(\d{0,7}) 进行匹配。然后发回匹配组 1 + 组 2 组成的结果,即前 2 个字母 + 前 7 位数字。

    如果 source 不是 Spanned 的实例,您可以检查 dest + source 是否匹配 ^[a-zA-Z]{0,2}\d{0,7}$。如果是,发回null,否则丢弃输入 - 发回一个空字符串。

    【讨论】:

    • 感谢您的回答,但问题是在第一次检查 [A-Za-z]{0,2}
    • 啊哈,所以你的字典完成有问题。检查这个问题的答案:stackoverflow.com/questions/3349121/…
    • 您可以添加测试示例作为答案吗?例如,用户已经输入“AB”,现在尝试输入“C”。你想丢弃“C”吗? - 是的“C”应该被解雇。我测试了几个变种,但都不能正常工作。
    【解决方案2】:

    这就是我所需要的,实际上不需要使用正则表达式,但它会以相同的方式工作。 answer reference

    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 (i < mAlphabetCount) {
                    if (!Character.isLetter(currentChar)) {
                        sourceAsSpannableBuilder.delete(i, i + 1);
                    }
                } else {
                    if (!Character.isDigit(currentChar)) {
                        sourceAsSpannableBuilder.delete(i, i + 1);
                    }
                }
            }
            return source;
        } else {
            StringBuilder filteredStringBuilder = new StringBuilder();
            for (int i = start; i < end; i++) {
                char currentChar = source.charAt(i);
                if (dest.length() < mAlphabetCount) {
                    if (Character.isLetter(currentChar)) {
                        filteredStringBuilder.append(currentChar);
                    }
                } else {
                    if (Character.isDigit(currentChar)) {
                        filteredStringBuilder.append(currentChar);
                    }
                }
            }
            return filteredStringBuilder.toString();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 2023-01-03
      • 2010-11-10
      • 2013-09-02
      • 2018-11-07
      相关资源
      最近更新 更多