如何限制editText中的某些字符

Nia*_*iaz 2 android android-edittext

请不要急于将此消息标记为“重复”。我找不到合适的例子。假设我想限制 editText 中的字符“{”。

让我们考虑一下我的代码的一些变体。我只在模拟器上试过。

       editName.addTextChangedListener(new TextWatcher() {
        public void afterTextChanged(Editable s) {
            String txt=s.toString();
            int len=txt.length();
            toastDebug("len="+myIntToStr(len));
            if (len>0) {
                try {
                    int pos=txt.indexOf("{");
                    if (pos>=0) s.replace(pos,pos+1,"");
                }
                catch(Exception e) {}
            }
        }
Run Code Online (Sandbox Code Playgroud)

如果我快速输入“{”,它会导致“stackOverFlow”崩溃。假设我慢慢输入“abcd{{{{{{{{}”。对于第一个视图,它看起来不错,editText 中没有“{”。但是如果我输入退格,它不会删除“abcd”,它会删除那些不可见的“{{{{{”

我试图更改“afterTextChanged”中的editText。下面的代码再次导致 stackOverflowError。

            public void afterTextChanged(Editable s) {
            String txt=s.toString();
            int len=txt.length();
            if (len>0) {
                try {
                   editName.setText(txt)
                   or
                   s.clear
                   s.append(txt)
                }
                catch(Exception e) {}
            }
        }
Run Code Online (Sandbox Code Playgroud)

在我键入“{”后,许多具有此类代码的示例会清除我的 editText。

好吧,我修改了这段代码如下:

    editName.setFilters(new InputFilter[] { filterName });

    private InputFilter filterName = new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        if (source==null) return null;
            return source.toString().replace("{","");
    }
};
Run Code Online (Sandbox Code Playgroud)

现在它起作用了。但我的 android:maxLength="25" 不起作用。可以键入任意数量的字符。

所以我很困惑如何限制editText中的简单字符。有任何想法吗?谢谢!

Luk*_*rog 5

您可以EditText通过TextWatcher在小部件上设置 a并插入以下逻辑来限制用户可以输入的字符:

// we are interested in this callback
@Override
public void afterTextChanged(Editable s) {
    String result = s.toString().replaceAll("\\{", "");
    if (!s.toString().equals(result)) {
         edit.setText(result); // "edit" being the EditText on which the TextWatcher was set
         edit.setSelection(result.length()); // to set the cursor at the end of the current text             
    }
}
Run Code Online (Sandbox Code Playgroud)

\\需要(以及其他字符),因为该{字符具有以图案的特殊含义。