【问题标题】:Can I used android:digits to only allow a single space?我可以使用 android:digits 只允许一个空格吗?
【发布时间】:2016-10-07 19:00:58
【问题描述】:

在我的 EditText 中,我需要限制除字母、数字和 单个 空格之外的所有字符。我尝试添加到 XML:

android:digits="abcdefghijklmnopqrstuvwxyz1234567890 " 

我仍然可以输入多个空格。如何更改此设置并允许用户输入不超过 1 个空格?

【问题讨论】:

  • 您可以在提交后验证用户输入,如果有多个空格则返回错误消息

标签: android android-edittext


【解决方案1】:

您必须以编程方式检查它。但请保留您拥有的 XML 内容。那还是不错的。只需检查空格数。试试这个:

    String str = myEditText.toString();
    int first = str.indexOf(" ");
    boolean noneOrOneSpace = (first != -1) ? str.indexOf(" ", first + 1) : true;

然后你需要应用它来在editText的textChangedListener中使用它。发生更改时删除,您会注意到第二个空格,然后删除 EditText 中的最后一个字符

【讨论】:

    【解决方案2】:

    在这种情况下,数字将不起作用。

    您可以尝试使用 TextWatcher,然后将用户输入的所有多个空格替换为单个空格。

    例如:

    yourEditText.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
    
                @Override
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    yourEditText.removeTextChangeListener(this);
    
                    // Uses append() method on edit-text instead of setText()
                    // in an order to prevent soft keyboard reset.
                    String tempStr = s.toString().substring(0, s.length());
                    yourEditText.getText().clear();
    
                    // This line replaces all the multiple spaces with single space.
                    tempStr = tempStr.replaceAll("\\s+", " ");
    
                    yourEditText.append(tempStr);
                    yourEditText.setSelection(tempStr.length());
    
                    yourEditText.addTextChangedListener(this);
                }
    
                @Override
                public void afterTextChanged(Editable s) {}
            }); 
    

    【讨论】:

      【解决方案3】:

      我想我有一个干净的解决方案:

       inputText.addTextChangedListener(new TextWatcher() {
      
                  public void onTextChanged(CharSequence s, int start, int before, int count) {
                  }
      
                  public void beforeTextChanged(CharSequence s, int start, int count,
                                                int after) {
                  }
      
                  public void afterTextChanged(Editable s) {
                      int whiteSpaceCount = 0;
                      for (int i = 0; i < s.toString().length(); i++) {
                          if (Character.isWhitespace(s.charAt(i))) {
                              whiteSpaceCount++;
                          }
                          if (whiteSpaceCount > 1 && !Character.isLetter(s.charAt(i))) {
                              s.replace(i, i + 1, "");
                          }else if (!Character.isLetter(s.charAt(i)) && !Character.isWhitespace(s.charAt(i))) {
                              s.replace(i, i + 1, "");
                          }
                      }
                  }
      
              });
      

      希望对你有帮助,别忘了在最后显示之前把 inputText 剪掉,这样如果用户在开头或结尾输入了空格,我们就可以剪掉它。

      【讨论】:

        【解决方案4】:

        这里的代码 sn-p 工作得很好。在文本更改后调用它不会进入无限循环,同时在 TextWatcher 中设置文本

        public void handleSpaceValidation(EditText editText, Editable editable) {
            String s = editText.getText().toString();
            int count = 0;
            loop:
            for (int i = 0; i < editable.length(); i++) {
                if (editable.charAt(i) == ' ') {
                    count++;
                    if (count > 1) {
                        String after = s.trim().replaceAll(" +", " ");
                        editText.setText(after);
                        editText.setSelection(after.length());
                        break loop;
                    }
        
        
                }
            }
        }
        

        【讨论】:

          【解决方案5】:

          Digits 没有那种能力。您必须为您的 EditText 创建一个自定义过滤器。

          【讨论】:

          • 你能举个例子吗?
          【解决方案6】:

          我已经解决了我的问题,我必须在打字时只允许一个空格。

          editText.addTextChangedListener(new TextWatcher() {
                      @Override
                      public void beforeTextChanged(CharSequence s, int start, int count, int after) {
          
                          Log.e("BeforeText", String.valueOf(s));
                      }
          
                      @Override
                      public void onTextChanged(CharSequence s, int start, int before, int count) {
                          Log.e("OnText", String.valueOf(s));
          
          
          
          //
                      }
          
                      @Override
                      public void afterTextChanged(Editable s) {
                          Log.e("AfterText", String.valueOf(s));
                          if(editText.getText().toString().length()>1)
                          {
                              if(editText.getText().toString()
                                      .charAt(editText.getText().toString().length()-1)
                                      ==editText.getText().toString()
                                      .charAt(editText.getText().toString().length()-2))
                              {
                                  String value=editText.getText().toString().substring(0,
                                          editText.getText().toString().length()-1);
                                  editText.setText(value);
                                  editText.setSelection(value.length());
                              }
                          }
          
                      }
                  });
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-01-20
            • 1970-01-01
            • 2014-08-28
            • 2016-03-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多