【问题标题】:How to create EditText accepts Alphabets only in android?如何创建 EditText 仅在 android 中接受字母?
【发布时间】:2011-01-22 14:54:03
【问题描述】:

如何在 android 的 EditText 中只输入字母?

【问题讨论】:

标签: android layout android-edittext


【解决方案1】:

用你的 EditText 标签添加这一行。

android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

您的 EditText 标记应如下所示:

<EditText
        android:id="@+id/editText1"
        android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

【讨论】:

  • 非拉丁字符呢?
  • 无法输入空格。如何在其中允许单个空格
  • 额外添加这一行建议 android:inputType="text|textNoSuggestions"
  • 插入字符后,如果我们尝试添加数字,它会重复前一个字符
  • 也可以使用这个来允许空格:android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ "
【解决方案2】:
edittext.setFilters(new InputFilter[] {
    new InputFilter() {
        public CharSequence filter(CharSequence src, int start,
                int end, Spanned dst, int dstart, int dend) {
            if(src.equals("")){ // for backspace
                return src;
            }
            if(src.toString().matches("[a-zA-Z ]+")){
                return src;
            }
            return edittext.getText().toString();
        }
    }
});

请彻底测试!

【讨论】:

  • 它对我不起作用。我也这样做了,但是当我在 EditText 中输入数字或特殊字符时,它会删除之前输入的所有字符。为什么会这样?
  • @Nayana_Das 这可能是因为return ""; 这一行。用一些没有无效字符的文本替换该行,而不是返回一个空字符串。
  • 对我不起作用。当我输入一个数字时,如果重复 EditText 中的文本。所以如果我写了“aba”,它将把“abaaba”放在EditText中。
  • 当我按 ( ) 或数字时,它会复制数据,这是该答案的一个严重问题。去找@swetabhSuman 的答案。
【解决方案3】:

对于那些希望他们的 editText 只接受字母和空格(既不包括数字也不接受任何特殊字符)的人,那么可以使用 InputFilter。 这里我创建了一个名为getEditTextFilter()的方法,并在其中编写了InputFilter。

public static InputFilter getEditTextFilter() {
        return new InputFilter() {

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

                boolean keepOriginal = true;
                StringBuilder sb = new StringBuilder(end - start);
                for (int i = start; i < end; i++) {
                    char c = source.charAt(i);
                    if (isCharAllowed(c)) // put your condition here
                        sb.append(c);
                    else
                        keepOriginal = false;
                }
                if (keepOriginal)
                    return null;
                else {
                    if (source instanceof Spanned) {
                        SpannableString sp = new SpannableString(sb);
                        TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
                        return sp;
                    } else {
                        return sb;
                    }
                }
            }

            private boolean isCharAllowed(char c) {
                Pattern ps = Pattern.compile("^[a-zA-Z ]+$");
                Matcher ms = ps.matcher(String.valueOf(c));
                return ms.matches();
            }
        };
    }

找到它后将此 inputFilter 附加到您的 editText,如下所示:

mEditText.setFilters(new InputFilter[]{getEditTextFilter()});

最初归功于@UMAR,他提出了使用正则表达式和@KamilSeweryn 进行验证的想法

【讨论】:

  • 最佳答案。不知道为什么不再投票。 android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" 是最糟糕的解决方案,因为 android:imeOption 无法使用它。
  • @wonsuc 干什么用的?
  • 正如@mdzeko 建议的那样:"^[a-zA-Z ]+$" -> "^[\\p{L} ]+$" 它适用于 Unicode。
  • 谢谢你!你拯救了我的一天!但它不适用于某些设备(包括我的 - xiaomi redmi note 2),需要删除对EditText 的建议。唯一可行的方法是设置android:inputType="textVisiblePassword"。我还更改了isCharAllowed(c) 函数并使其没有Regex。我的方式:allowSymbols.contains(c, ignoreCase = true),其中allowSymbols - 带有允许字符的string
【解决方案4】:
EditText state = (EditText) findViewById(R.id.txtState);


                Pattern ps = Pattern.compile("^[a-zA-Z ]+$");
                Matcher ms = ps.matcher(state.getText().toString());
                boolean bs = ms.matches();
                if (bs == false) {
                    if (ErrorMessage.contains("invalid"))
                        ErrorMessage = ErrorMessage + "state,";
                    else
                        ErrorMessage = ErrorMessage + "invalid state,";

                }

【讨论】:

  • 好主意..它帮助我制定了自己的逻辑...谢谢:)
  • 空间怎么样
【解决方案5】:

通过 Xml,您可以轻松地在 xml (editText) 中键入以下代码...

android:digits="abcdefghijklmnopqrstuvwxyz"

只接受字符...

【讨论】:

    【解决方案6】:

    把代码edittext xml文件,

       android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
    

    【讨论】:

      【解决方案7】:

      在 EditText android 中只允许字母:

      InputFilter letterFilter = new InputFilter() {
              public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
                  String filtered = "";
                  for (int i = start; i < end; i++) {
                      char character = source.charAt(i);
                      if (!Character.isWhitespace(character)&&Character.isLetter(character)) {
                          filtered += character;
                      }
                  }
      
                  return filtered;
              }
      
          };
      editText.setFilters(new InputFilter[]{letterFilter}); 
      

      【讨论】:

      • 经过几次自定义后,这符合我的要求。 +1
      【解决方案8】:

      对于空格,您可以在数字中添加单个空格。如果您需要任何特殊字符,例如点,逗号也可以添加到此列表中

      android:digits="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"

      【讨论】:

        【解决方案9】:

        如果还有人想要这个,Java regex for support Unicode? 是一个不错的选择。它适用于当您只需要 EditText 旁边的字母(无论是什么编码 - 日语、瑞典语)时。稍后,您可以使用MatcherPattern.compile() 进行检查

        【讨论】:

          【解决方案10】:

          试试这个

          <EditText
            android:id="@+id/EditText1"
            android:text=""
            android:inputType="text|textNoSuggestions"
            android:textSize="18sp"
            android:layout_width="80dp"
            android:layout_height="43dp">
          </EditText>
          

          可以找到其他的inputType Here ..

          【讨论】:

            【解决方案11】:
            • 只需在您的 xml 文件中使用属性 android:inputType="text"

            前: 如果您希望用户提供电子邮件地址文本:

             <EditText
                android:id="@+id/user_address"
                android:inputType="textEmailAddress"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
            

            随意使用 android studio 的自动完成功能检查许多其他输入属性: Auto complete Demo

            【讨论】:

              【解决方案12】:

              试试这个方法

              对于 Java:

              EditText yourEditText = (EditText) findViewById(R.id.yourEditText);
              yourEditText.setFilters(new InputFilter[] {
              new InputFilter() {
                  @Override
                  public CharSequence filter(CharSequence cs, int start,
                              int end, Spanned spanned, int dStart, int dEnd) {
                      // TODO Auto-generated method stub
                      if(cs.equals("")){ // for backspace
                           return cs;
                      }
                      if(cs.toString().matches("[a-zA-Z ]+")){
                           return cs;
                      }
                      return "";
                  }
              }});
              

              对于 Kotlin:

               val yourEditText = findViewById<View>(android.R.id.yourEditText) as EditText
                  val reges = Regex("^[0-9a-zA-Z ]+$")
                  //this will allow user to only write letter and white space
                  yourEditText.filters = arrayOf<InputFilter>(
                      object : InputFilter {
                          override fun filter(
                              cs: CharSequence, start: Int,
                              end: Int, spanned: Spanned?, dStart: Int, dEnd: Int,
                          ): CharSequence? {
                              if (cs == "") { // for backspace
                                  return cs
                              }
                              return if (cs.toString().matches(reges)) {
                                  cs
                              } else ""
                          }
                      }
                  )
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2014-02-19
                • 2014-06-06
                • 2015-08-13
                • 2021-10-22
                • 2018-06-14
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多