【问题标题】:Android EditText Space ValidationAndroid EditText 空间验证
【发布时间】:2013-10-22 06:56:38
【问题描述】:

我的 android 应用程序中有一个 Edittext。我不想让用户输入第一个空格字符..但是输入其他字符后用户也可以输入空格..我用过

    <EditText
    android:id="@+id/editText1_in_row"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:inputType="text" 
    android:digits="_,qwertzuiopasdfghjklyxcvbnm,QWERTYUIOPASDFGHJKLZXCVBNM,0123456789">

但在这种情况下,用户不能输入空格。

我也使用过 Text Watcher 但我不需要在输入文本时允许用户作为 android:digits 有效。

【问题讨论】:

  • 文本观察器有什么问题?
  • 使用正则表达式 ^[a-zA-Z0-9_ ]*$
  • 检查这个链接..stackoverflow.com/questions/14315633/…它会帮助你
  • @PankajKumar 我希望用户不能按空格按钮(android:digits 有效),但文本观察者不会这样做。

标签: android android-edittext


【解决方案1】:
final EditText editText = (EditText)findViewById(R.id.editText1_in_row);


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

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

                if(editText.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 = true;
                    }

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


                }
                return builder.toString();          
            }

        };


        editText.setFilters(new InputFilter[]{filter});

并从您的 EditText 中删除此属性

android:digits="_,qwertzuiopasdfghjklyxcvbnm,QWERTYUIOPASDFGHJKLZXCVBNM,0123456789"

此代码完全符合您的需求。

【讨论】:

  • 我认为您不需要引用 editText 来检索文本。您在source 参数上拥有所需的一切。
【解决方案2】:

使用InputFilter轻松处理输入第一个空格字符忽略

editText 上的第一个 setFilters() 方法

editText.setFilters(new InputFilter[]{ignoreFirstWhiteSpace()});

制作输入过滤器

    // ignore enter First space on edittext
    public InputFilter ignoreFirstWhiteSpace() {
        return new InputFilter() {
            public CharSequence filter(CharSequence source, int start, int end,
                                       Spanned dest, int dstart, int dend) {

                for (int i = start; i < end; i++) {
                    if (Character.isWhitespace(source.charAt(i))) {
                        if (dstart == 0)
                            return "";
                    }
                }
                return null;
            }
        };
    }

无需在 XML 上编写 android:digits 属性

删除此行

android:digits="_,qwertzuiopasdfghjklyxcvbnm,QWERTYUIOPASDFGHJKLZXCVBNM,0123456789"

【讨论】:

    【解决方案3】:

    这对我有用

     android:inputType="textPersonName"
     android:digits= "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890_-!@#$%^*()"
    

    【讨论】:

      【解决方案4】:

      为什么你不能使用 editText.getText().trim();使用 EditText 数据时的函数

      【讨论】:

      • 是的,我可以使用,但我想限制用户(意味着如果用户按下第一个字母的按钮,那么它将不起作用,之后它将起作用)
      【解决方案5】:

      如果要过滤 EditText 中的输入字符,则需要使用 InputFilter。这是示例。 //只允许字母或数字

      InputFilter filter = new InputFilter() { 
         public CharSequence filter(CharSequence source, int start, int end,
           Spanned dest, int dstart, int dend) {
          for (int i = start; i < end; i++) { 
                    if (!Character.isLetterOrDigit(source.charAt(i))) { 
                        return ""; 
                    }
                }
          return null;
         } 
              }; 
      
       EditText text = (EditText)findViewById(R.id.edittext1);
      text.setFilters(new InputFilter[]{filter});
      

      详情看here

      【讨论】:

      • 我想限制用户不要进入第一个空格。请解释此解决方案的工作原理
      【解决方案6】:

      使用这个。如果起始 Position 处的字符是空格,则将 textView Text 设置为空白

      editText1_in_row.addTextChangedListener(new TextWatcher() {
      
                      @Override
                      public void onTextChanged(CharSequence s, int start, int before, int count) {
                          if (s.length()>0 && s.subSequence(0, 1).toString().equalsIgnoreCase(" ")) {
                              editText1_in_row.setText("");               }
      
                      }
      
                      @Override
                      public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                          // TODO Auto-generated method stub
      
                      }
      
                      @Override
                      public void afterTextChanged(Editable s) {
                          // TODO Auto-generated method stub
      
                      }
                  });
      

      【讨论】:

      • 不,如果我在您的解决方案中使用 android:digits..我在输入章程后无法输入空格..
      • 编辑了我的答案。请检查
      【解决方案7】:

      https://stackoverflow.com/users/2868352/abhishek-v 答案略有不同。

      public class NoInitialSpaceFilter implements InputFilter {
          @Override
          public CharSequence filter(final CharSequence source, final int start, final int end, final Spanned dest, final int dstart, final int dend) {
              if (dstart == 0) {
                  for (int i = start; i < end; i++) {
                      if (Character.isSpaceChar(source.charAt(i))) {
                          return "";
                      }
                  }
              }
              return null;
          }
      }
      

      用法:

      editText.setFilters(new InputFilter[]{new NoInitialSpaceFilter});
      

      【讨论】:

        【解决方案8】:

        仅像其他人在开始时所说的那样限制用户键入空格:

                @Override
                public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
                    String text = createPL.getText().toString();
        
                    //restrict space for first char
                    if (text.startsWith(" ")) {
                        edittext.setText(text.trim());
                    }
        
                }
        

        【讨论】:

          【解决方案9】:
          android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890.,_-!@#$()+=><:;?"
          

          【讨论】:

            【解决方案10】:

            这是我在 EditText 中用于名称验证的过滤器。第一个字母大写字母,不是空格和特殊字符。完成单词后不允许超过一个空格。

            public void setNameFilter() {
                InputFilter filter = new InputFilter() {
                    @RequiresApi(api = Build.VERSION_CODES.KITKAT)
                    public CharSequence filter(CharSequence source, int start, int end,
                                               Spanned dest, int dstart, int dend) {
                        for (int i = start; i < end; i++) {
                            if (dend == 0) {
                                if (Character.isSpaceChar(source.charAt(i)) ||
                                        !Character.isAlphabetic(source.charAt(i))) {
                                    return Constants.Delimiter.BLANK;
                                } else {
                                    return String.valueOf(source.charAt(i)).toUpperCase();
                                }
                            } else if (Character.isSpaceChar(source.charAt(i)) &&
                                    String.valueOf(dest).endsWith(Constants.Delimiter.ONE_SPACE)) {
                                return Constants.Delimiter.BLANK;
                            } else if ((!Character.isSpaceChar(source.charAt(i)) &&
                                    !Character.isAlphabetic(source.charAt(i)))) {
                                return Constants.Delimiter.BLANK;
                            }
                        }
                        return null;
                    }
                };
                editText.setFilters(new InputFilter[]{filter, new InputFilter.LengthFilter(Constants.Length.NAME_LENGTH)});
            }
            

            【讨论】:

              猜你喜欢
              • 2013-08-05
              • 2013-12-09
              • 2014-02-19
              • 2013-03-13
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-09-02
              • 2012-12-05
              相关资源
              最近更新 更多