当前位置: 首页 > 知识库问答 >
问题:

EditText上的InputFilter导致文本重复

吴嘉禧
2023-03-14

我正在尝试实现一个编辑文本,该文本仅将输入限制为大写字符[A-Z0-9]和数字。

我从某篇文章开始使用InputFilter方法。但我在三星Galaxy Tab 2上遇到了一个问题,但在模拟器或Nexus 4上没有。

问题是这样的:

  1. 当我键入“A”时,文本显示为“A”很好
  2. 现在,当我键入“B”时,文本应该是“AB”,但它给了我“AAB”,这看起来很奇怪

简而言之,它重复字符

以下是我正在使用此代码的代码:

public class DemoFilter implements InputFilter {

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

        if (source.equals("")) { // for backspace
            return source;
        }
        if (source.toString().matches("[a-zA-Z0-9 ]*")) // put your constraints
                                                        // here
        {
            return source.toString().toUpperCase();
        }
        return "";
    }
}

文件代码:

<EditText
    android:id="@+id/et_licence_plate_1"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="3"
    android:hint="0"
    android:imeOptions="actionNext"
    android:inputType="textNoSuggestions"
    android:maxLength="3"
    android:singleLine="true"
    android:textSize="18px" >
</EditText>

我完全被困在这个问题上了,所以这里的任何帮助都将不胜感激。

共有3个答案

公孙驰
2023-03-14

我在Android的输入过滤器中发现了许多错误,我不确定这些是错误还是有意为之。但肯定不符合我的要求。所以我选择使用TextWatcher而不是InputFilter

private String newStr = "";

myEditText.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence s, int start, int count, int after) {
            // Do nothing
        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String str = s.toString();
            if (str.isEmpty()) {
                myEditText.append(newStr);
                newStr = "";
            } else if (!str.equals(newStr)) {
                // Replace the regex as per requirement
                newStr = str.replaceAll("[^A-Z0-9]", "");
                myEditText.setText("");
            }
        }

        @Override
        public void afterTextChanged(Editable s) {
            // Do nothing
        }
    });

上面的代码不允许用户在编辑文本中输入任何特殊符号。只允许大写字母数字字符。

邬英武
2023-03-14

我也遇到了同样的问题,在用这里发布的解决方案解决了这个问题之后,自动完成键盘仍然存在一个问题。一种解决方案是将inputType设置为“visiblePassword ”,但这减少了功能,不是吗?

当在< code>filter()方法中返回非空结果时,我可以通过调用

TextUtils.copySpansFrom((Spanned) source, start, newString.length(), null, newString, 0);

这会将自动完成的范围复制到新的结果中,并修复选择自动完成建议时出现的奇怪的重复行为。

乐正峰
2023-03-14

字符重复的问题来自InputFilter糟糕的实现。如果替换不应该改变,则返回null:

@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    boolean keepOriginal = true;
    StringBuilder sb = new StringBuilder(end - start);
    for (int i = start; i < end; i++) {
        char c = source.charAt(i);
        if (isCharAllowed(c)) // put your condition here
            sb.append(c);
        else
            keepOriginal = false;
    }
    if (keepOriginal)
        return null;
    else {
        if (source instanceof Spanned) {
            SpannableString sp = new SpannableString(sb);
            TextUtils.copySpansFrom((Spanned) source, start, end, null, sp, 0);
            return sp;
        } else {
            return sb;
        }           
    }
}

private boolean isCharAllowed(char c) {
    return Character.isUpperCase(c) || Character.isDigit(c);
}
 类似资料:
  • 在某些设备中,当我尝试从edittext中选择文本以复制它时,会导致 算术异常 此方法中的异常原因 Android.Widget.Editor.UpdateShowAsAction(Editor.java:6034) 这里是我的edittext的xml代码

  • 本文向大家介绍InputFilter实现EditText文本输入过滤器实例代码解析,包括了InputFilter实现EditText文本输入过滤器实例代码解析的使用技巧和注意事项,需要的朋友参考一下  EditText是Android的文本输入框控件,这地球人应该都知道的了,但是默认的EditText是无所不能输入的,有时候我们需要设计一 款软件,而且是给小孩子使用的,而且需要屏蔽以下未成年人所不

  • 我正在尝试实现一个编辑文本,将输入限制为仅 Alpha 字符 [A-Za-z]。 我从本文中的InputFilter方法开始。当我键入“a%”时,文本消失,如果我按退格键,文本为“a”。我尝试过过滤器函数的其他变体,比如使用正则表达式只匹配[a-Za-z],有时会看到疯狂的行为,比如重复字符,我会键入“a”,然后键入“b”,再键入“aab”,然后再键入“c”,再得到“aabaabc”,然后按退格键

  • 任何帮助都将得到承认。

  • 我一直在像这样限制我的编辑文本的输入; 但是任何使用过这种方法的人都会知道,当它与自动更正和退格键混合使用时,会导致重复字符。为了解决这个问题,我像这样从键盘上删除了自动更正栏; 现在,这在现有的Android键盘上运行良好,但问题是在替代键盘上(来自Google play),它不禁用自动更正,因此我再次遇到重复字符的问题。有人遇到过这个问题吗/知道如何解决吗?

  • 问题内容: 我想将字符限制为0-9,az,AZ和空格键。设置输入类型I可以限制为数字,但是我无法弄清Inputfilter在文档中查找的方式。 问题答案: 我在另一个论坛上找到了这个。像冠军一样工作。