EditText上的InputFilter导致重复文本

sam*_*m_k 15 android android-edittext android-input-filter

我正在尝试实现一个EditText限制仅限数字[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 "";
    }
}
Run Code Online (Sandbox Code Playgroud)

XML文件代码:

<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>
Run Code Online (Sandbox Code Playgroud)

我完全坚持这个,所以在这里任何帮助将不胜感激.

Kam*_*ryn 12

字符重复的问题来自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);
}
Run Code Online (Sandbox Code Playgroud)

  • 你可以尝试android:inputType ="textVisiblePassword"来禁用自动完成,这是inputfilter的真正问题.这不是正确的方法,但它只是有效.干杯! (2认同)

CRU*_*DER 2

输入过滤器可以附加到 Editable S 以限制可以对它们进行的更改。请注意它强调所做的更改而不是它包含的整个文本。

按照如下所述...

 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
            {
               char[] ch = new char[end - start];

              TextUtils.getChars(source, start, end, ch, 0);

                // make the characters uppercase
                String retChar = new String(ch).toUpperCase();
                return retChar;
            }
            return "";
        }
    }
Run Code Online (Sandbox Code Playgroud)