【问题标题】:Specific number of characters as letters and the succeeding characters as numbers特定数量的字符为字母,后面的字符为数字
【发布时间】:2018-04-04 11:31:24
【问题描述】:

我希望用户只在前 5 个字符中键入字母,而接下来的字符只能是数字。

我已阅读此链接的答案:Validation allow only number and characters in edit text in android

但是,当我尝试做我想做的事情时,我收到错误消息:

java.lang.StringIndexOutOfBoundsException: 长度=1;索引=1 在 java.lang.String.charAt(Native Method)

我试图做我想做的代码。

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

                    for (int i = start;i < etLettersAndNumbers.getText().length();i++) {

                        if (etLettersAndNumbers.getText().length() < 4) {
                            if (!Character.isLetter(source.charAt(i))) {
                                return "";
                            }
                        }

                        if (etLettersAndNumbers.getText().length() >= 4) {
                            if (!Character.isDigit(source.charAt(i))) {
                                return "";
                            }
                        }
                    }

                    return null;
                }
            };
            etLettersAndNumbers.setFilters(new InputFilter[] {filter});

我正在使用动态 EditText。

【问题讨论】:

  • 试试这个 [a-zA-Z]{5}\d 正则表达式
  • 对不起,我把它放在哪里?
  • 您所说的“仅在前 5 个字符中输入字母”和“下一个字符只能是数字”是什么意思?
  • @Rabee 例如,ABCDE123456789,
  • 您当前的循环终止是在etLettersAndNumbers.getText().length() 基础上,而我想它应该在您收到的“结束”参数上。

标签: android


【解决方案1】:

试试这个:

 public void set(final EditText etLettersAndNumbers) {
    etLettersAndNumbers.addTextChangedListener(new TextWatcher() {
        int len = 0;

        @Override
        public void afterTextChanged(Editable s) {

        }

        @Override
        public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {


        }

        @Override
        public void onTextChanged(CharSequence s, int start, int before, int count) {
            String str = etLettersAndNumbers.getText().toString();
            char[] st = str.toCharArray();
            try {
                if (Character.isLetter(st[st.length - 1]) && st.length - 1 < 5) {
                    System.out.print("Nothing");
                } else if (!Character.isLetter(st[st.length - 1]) && st.length - 1 < 5) {
                    if(count>0)
                    etLettersAndNumbers.setText("");
                } else if (Character.isLetter(st[st.length - 1]) && st.length - 1 >= 5) {
                    if(count>0)
                    etLettersAndNumbers.setText("");
                }
            } catch (Exception e) {
                e.getMessage();
            }

        }


    });
}

【讨论】:

  • 当我输入超过 5 个字符时崩溃,我仍然能够在第 6 个字母处输入一个字母。错误:java.lang.StackOverflowError:堆栈大小 8MB
  • 我在我的手机中使用,它工作正常。请检查您的代码位置。你在使用动态 EditText 吗?
  • 动态EditText是什么意思? :O 我只是使用 android studio 提供的 EditText 呵呵
  • 动态表示:EditText t = new EditText(this);
  • 哦,是的,我就是这么做的。并添加: .addTextChangedListener (new TextWatcher() {....
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-04
相关资源
最近更新 更多