【问题标题】:How to restrict the EditText to accept only alphanumeric characters如何限制 EditText 只接受字母数字字符
【发布时间】:2014-06-06 09:44:07
【问题描述】:

如何限制EditText 只接受字母数字字符,而EditText 中的小写和大写字符都显示为大写?

<EditText
    android:id="@+id/userInput"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:inputType="textMultiLine"
    android:minLines="3" >

    <requestFocus />
</EditText>

如果用户键入小写“abcd”,EditText 应自动显示大写“ABCD”,而无需将键盘限制为大写。

【问题讨论】:

标签: android validation android-edittext


【解决方案1】:

在 XML 中添加:

 android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "

【讨论】:

  • 在这种情况下,如果我输入任何其他字符,则会自动输入多个字符
  • 有什么办法可以限制用户只输入字母或单个空格。
  • @Ravi 只是删除数字?将最后的空间留给单个空格
  • 这不允许 OP 要求的大写字符。
  • 这个解决方案加上textAllCaps="true"应该做的事情
【解决方案2】:

如何将 EditText 限制为仅接受字母数字字符,以便用户输入的任何小写或大写键,EditText 都会显示大写

InputFilter 解决方案效果很好,让您可以完全控制以比android:digits 更精细的粒度级别过滤输入。如果所有字符都有效,filter() 方法应返回 null,如果某些字符无效,则应返回仅包含有效字符的 CharSequence。如果复制粘贴多个字符,有的字符无效,则只保留有效字符。

public static class AlphaNumericInputFilter implements InputFilter {
    public CharSequence filter(CharSequence source, int start, int end,
            Spanned dest, int dstart, int dend) {

        // Only keep characters that are alphanumeric
        StringBuilder builder = new StringBuilder();
        for (int i = start; i < end; i++) {
            char c = source.charAt(i);
            if (Character.isLetterOrDigit(c)) {
                builder.append(c);
            }
        }

        // If all characters are valid, return null, otherwise only return the filtered characters
        boolean allCharactersValid = (builder.length() == end - start);
        return allCharactersValid ? null : builder.toString();
    }
}

另外,在设置InputFilter 时,必须确保不要覆盖EditText 上设置的其他InputFilters;这些可以在 XML 中设置,例如android:maxLength。您还必须考虑设置InputFilters 的顺序,它们按该顺序应用。幸运的是,InputFilter.AllCaps 已经存在,因此应用我们的字母数字过滤器将保留所有字母数字文本,并将其转换为大写。

    // Apply the filters to control the input (alphanumeric)
    ArrayList<InputFilter> curInputFilters = new ArrayList<InputFilter>(Arrays.asList(editText.getFilters()));
    curInputFilters.add(0, new AlphaNumericInputFilter());
    curInputFilters.add(1, new InputFilter.AllCaps());
    InputFilter[] newInputFilters = curInputFilters.toArray(new InputFilter[curInputFilters.size()]);
    editText.setFilters(newInputFilters);

【讨论】:

  • 这应该是公认的答案。我已经在这个页面和其他页面上尝试了建议的解决方案,只有这个解决方案完美地覆盖了我的所有设备(三星是一个特别烦人的设备)。有些人只给了我数字输入,有些人只是没有输入任何抱怨输入中初始长度为 0 的字符等。我还将设置过滤器简写为 editText.setFilters(new InputFilter[]{new InputFilter.AllCaps(), alphanumericFilter});
  • @ZooS 您的速记将覆盖EditText 上已经存在的任何InputFilters。请阅读我在代码块上方的解释,过滤器的设置是出于非常具体的原因。
  • 我的错,没有完全阅读解释,你是对的。这是我认为的最佳解决方案。
  • 当你连续输入两个数字时会出现这个错误
  • @GoranHoriaMihail 如果您有多个非互斥过滤器,即长度为 10 的过滤器和字母数字过滤器,您可能希望首先应用字母数字过滤器,然后是长度为 10 的过滤器。否人物)。当用户将文本从 PW 管理器粘贴到 EditText 时,这将发挥作用。
【解决方案3】:

如果你不想要太多的自定义,一个简单的技巧实际上来自上面的一个,所有你想在 android:digits 中添加的字符

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

这应该可以接受带有大写字母和小写字母的字母数字值。

【讨论】:

  • 这对于多语言应用程序会失败。
【解决方案4】:

使用这个:

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
android:inputType="textCapCharacters"

我尝试使用textAllCaps="true",正如对此问题已接受答案的评论中所建议的那样,但它没有按预期工作。

【讨论】:

  • 这对于多语言应用程序会失败。
【解决方案5】:

您不想为此编写任何正则表达式,您只需将 XML 属性添加到您的编辑文本中

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
android:inputType="textCapCharacters"

经过测试,可以完美地进行 PAN 卡验证。

【讨论】:

  • 节省时间!非常感谢。
  • 无法正常工作。在输入无效(特殊)字符时,它会发生故障。
【解决方案6】:

试试这个:

private void addFilterToUserName()
    {

        sign_up_display_name_et.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 0-9]+")){
                            return src;
                        }
                        return "";
                    }
                }
        });
    }

【讨论】:

    【解决方案7】:

    极简的 Kotlin 方法:

    fun EditText.allowOnlyAlphaNumericCharacters() {
        filters = filters.plus(
            listOf(
                InputFilter { s, _, _, _, _, _->
                    s.replace(Regex("[^A-Za-z0-9]"), "")
                },
                InputFilter.AllCaps()
            )
        )
    }
    

    【讨论】:

    【解决方案8】:

    为此,您需要创建自定义过滤器并像这样设置为您的 EditText。

    这会自动将您的字母转换为大写。

    EditText editText = (EditText)findViewById(R.id.userInput);
    InputFilter myFilter = new InputFilter() {
    
        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
            try {
                Character c = source.charAt(0);
                if (Character.isLetter(c) || Character.isDigit(c)) {
                    return "" + Character.toUpperCase(c);
                } else {
                    return "";
                }
            } catch (Exception e) {
            }
            return null;
        }
    };
    editText.setFilters(new InputFilter[] { myFilter });
    

    在 xml 文件中无需设置其他参数。

    【讨论】:

    • 我根据某些条件使用了这种方法来做最后一个字符资本。谢谢。
    【解决方案9】:

    这对我有用:

    android:inputType="textVisiblePassword"

    【讨论】:

      【解决方案10】:

      以编程方式执行以下操作:

      mEditText.setInputType(InputType.TYPE_TEXT_VARIATION_VISIBLE_PASSWORD);
      mEditText.setFilters(new InputFilter[] {
          new InputFilter() {   
              @Override  
              public CharSequence filter(CharSequence input, int start, int end, Spanned dst, int dstart, int dend) { 
                  if (input.length() > 0 && !Character.isLetterOrDigit(input.charAt(0))) {  
                      // if not alphanumeric, disregard the latest input
                      // by returning an empty string 
                      return ""; 
                  }
                  return null;
              }  
          }, new InputFilter.AllCaps()
      });
      

      请注意,对setInputType 的调用是必要的,以便我们确定input 变量始终是用户给出的最后一个字符。

      我已经尝试过 SO 中讨论的其他解决方案。但他们中的许多人在某些情况下表现得很奇怪,例如当您打开快速周期(Tap space bar twice for period followed by space) 设置时。使用此设置,它会从您的输入文本中删除一个字符。这段代码也解决了这个问题。

      【讨论】:

        【解决方案11】:
        <EditText
                            android:layout_width="match_parent"
                            android:layout_height="wrap_content"
                            android:hint="PromoCode"
                            android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
                            android:inputType="text" />
        

        【讨论】:

          【解决方案12】:

          我尝试了@methodSignature 的解决方案,但正如@Aba 所述,它正在生成重复/奇怪的字符串。于是修改了。

          科特林:

          fun EditText.allowOnlyAlphaNumericCharacters() {
          filters = arrayOf(
              InputFilter { src, start, end, dst, dstart, dend ->
                  if (src.toString().matches(Regex("[a-zA-Z 0-9]+"))) {
                      src
                  } else ""
              }
          )
          

          }

          【讨论】:

            【解决方案13】:
            private static final int MAX_LENGTH =13;
            

            et_ScanLotBrCode.setFilters(new InputFilter[]{new InputFilter.AllCaps(),new InputFilter.LengthFilter(MAX_LENGTH) });

            将以上代码添加到activity或fragment中,使用它可以管理输入和大写字母的长度。

            【讨论】:

            • 这个问题没有问关于限制长度的问题。它询问如何限制EditText 只接受字母数字字符并以大写形式显示。
            【解决方案14】:

            一行回答

            XML 添加这个 textAllCaps="true"

            onCreate() 执行此操作

            小写和大写,留出空格

            yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "));
            

            为小写并允许空格 (此问题的必填答案)

            yourEditText.setKeyListener(DigitsKeyListener.getInstance("abcdefghijklmnopqrstuvwxyz1234567890 "));
            

            大写,留出空格

            yourEditText.setKeyListener(DigitsKeyListener.getInstance("ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890 "));
            

            【讨论】:

            • 这不允许 OP 要求的小写字符或数字。
            • @StevenByle 感谢您的回复。我已经编辑了答案
            • 另外,PL 再次阅读问题:“如果用户输入小写“abcd”,EditText 应该自动显示大写“ABCD”,而无需将键盘限制为大写。”
            • 它只允许数字
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-09
            • 2012-01-09
            • 2016-07-01
            • 2011-04-17
            • 2022-11-02
            • 2010-10-21
            • 1970-01-01
            相关资源
            最近更新 更多