Android 如何限制editText中的某些字符

Android 如何限制editText中的某些字符,android,android-edittext,Android,Android Edittext,请不要急于将此邮件标记为“重复”。 我找不到合适的例子。 假设我想限制editText中的字符“{” 让我们考虑一下我的代码的一些变体。我只在仿真器上尝试过。 editName.addTextChangedListener(new TextWatcher() { public void afterTextChanged(Editable s) { String txt=s.toString(); int len=txt

请不要急于将此邮件标记为“重复”。 我找不到合适的例子。 假设我想限制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) {}
            }
        }
如果我快速键入“{”,将导致“stackOverFlow”崩溃。 假设我慢慢地键入“abcd{{{{{{}”,第一个视图看起来没问题,editText中没有“{”。 但如果我键入backspace,它不会删除“abcd”,而是删除那些不可见的“{{{{”

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

            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) {}
            }
        }
在我键入“{”后,许多示例都带有clear my 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("{","");
    }
};
现在它可以工作了。但是我的android:maxLength=“25”不能工作。 可以键入任意数量的字符

所以我很困惑,如何限制文本中的简单字符。
有什么想法吗?谢谢!

您也可以通过
xml
使用它

android:digits="0,1,2,3,4,5,6,7,8,9,.,@,qwertzuiopasdfghjklyxcvbnm"

android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "

你想把它放在这里。

我的假设是
android:maxLength
实际上是一个
InputFilter
,它添加到你的
EditText
中。因此如果你想添加更多
InputFilter
,你必须获得
EditText
的当前
InputFilter
数组,并用你自己的
InputFilter附加它de>。我这样做,这就行了

EditText editName = (EditText) findViewById(R.id.editText1);

        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("{","");
        }
    };

    //Get current Input Filter from EditText
    InputFilter[] oldInputFilter = editName.getFilters();
    //Create arrays for new InputFilter
    InputFilter[] newInputFilter = new InputFilter[oldInputFilter.length+1];
    //Copy all old Input Filter to new one
    System.arraycopy(oldInputFilter, 0, newInputFilter, 0, oldInputFilter.length);
    //Add your own input filter
    newInputFilter[newInputFilter.length-1] = filterName;
    //Set the new Input Filter
    editName.setFilters(newInputFilter);

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

// 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             
    }
}
\\
是必需的(对于其他字符也是如此),因为
{
字符在模式中具有特殊意义。

上述正确答案仅适用于一个文本。
The above correct answer only work for one EditText.
But this work for all the EditText in you XML.

        InputFilter filter = new InputFilter() { 
            boolean canEnterSpace = false;

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

                if(_edtUsername.getText().toString().equals(""))
                {
                    canEnterSpace = false;
                }

                StringBuilder builder = new StringBuilder();

                for (int i = start; i < end; i++) { 
                    char currentChar = source.charAt(i);

                    if (Character.isLetterOrDigit(currentChar) || currentChar == '{') {
                        builder.append(currentChar);
                        canEnterSpace = false;
                    }

                    if(Character.isWhitespace(currentChar) && canEnterSpace) {
                        builder.append(currentChar);
                    }


                }
                return builder.toString();          
            }

        };
        _edtUsername.setFilters(new InputFilter[]{filter});
        _edtFirstName.setFilters(new InputFilter[]{filter});
        _edtLastName.setFilters(new InputFilter[]{filter});
但这适用于XML中的所有EditText。 InputFilter=新的InputFilter(){ 布尔CAnterSpace=false; 公共CharSequence筛选器(CharSequence源、int开始、int结束、, 跨越目的地、内部数据起点、内部数据起点){ if(_edtUsername.getText().toString()等于(“”) { canInterspace=false; } StringBuilder=新的StringBuilder(); 对于(inti=start;i
谢谢

这里我用“.com替换为”

Xml:


这对你有帮助吗?@Niaz,你试过正则表达式吗?Luksprog,正如我所说的,如果我在afterTextChanged块中更改editText(如你提到的例子),我会得到“stackoverflow”。是的。它只是在editable to space中替换字符。但是如果我将“{”替换为“”,然后我得到了backspaceGödel77的奇怪行为,我无法理解关于常规表达式的想法。我已经用我链接的代码运行了一些测试,它可以工作,它不允许您输入
“{
字符(我也没有任何异常,无论我输入字符有多快,删除过程都可以工作)。唯一的更改是转义
{
,因为它将在常规异常中使用,所以它将不是“{”而是“\\{”。谢谢,我知道这样的解决方案,但它不适用于其他(英语除外)语言。可能UTF8字符适用于其他语言的digit=“…”,但排除两个字符要比设置所有可用的字符集舒服得多。幸运的是,editText的长度仍然是无限的,并且在键入abcd{{{{{{{{{{{{{{{{{{{{{{}后,backspace不会删除dbca,但只有这些不可见的字符{{{{{{{某个地方…你还在第一个和第二个代码中使用TextWatcher吗?你已经注释了editName.setFilters(新的InputFilter[]{filterName});第三个代码吗?哦,是的。我现在已经注释了。editText的最大长度是可以的,但奇怪的退格仍然存在。坦白说,如果我替换“{”有了空间,一切都没问题,但增加了额外的空间…坏消息是,您代码中的array.copyOf在Android 2.2上不起作用。但我的目标是为所有Android版本编写一个应用程序。。。。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.edittextdemo.MainActivity" >

    <EditText
        android:id="@+id/edt"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

</RelativeLayout>
public class MainActivity extends Activity {

    private EditText edt;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edt = (EditText) findViewById(R.id.edt);
        edt.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                String currentStr = s.toString().replaceAll(".com", "");
                if (!s.toString().equals(currentStr)) {
                    edt.setText(currentStr); 
                    edt.setSelection(currentStr.length());              
                }
            }
        });
    }