32

在我的应用程序中,我必须验证EditText. 它应该只允许字符、数字、下划线和连字符。

这是我的代码:

edittext.addTextChangedListener(new TextWatcher() {
                                        
    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        // TODO Auto-generated method stub                              
    }
                                        
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // TODO Auto-generated method stub
    }
                                        
    @Override
    public void afterTextChanged(Editable s) {
        // validation codes here
                                
        location_name=s.toString();
        Toast.makeText(getApplicationContext(),location_name, Toast.LENGTH_SHORT).show();                
        
        if (location_name.matches(".*[^a-z^0-9].*")) {
            location_name = location_name.replaceAll("[^a-z^0-9]", "");
            s.append(location_name);
            s.clear();
            Toast.makeText(getApplicationContext(),"Only lowercase letters and numbers are allowed!",Toast.LENGTH_SHORT).show();
        }                                   
    }

});     
                                    
location.add(location_name);

当我输入输入EditText时,应用程序被强制关闭。

4

9 回答 9

76

Android 中有一些非常简单的方法,而不是使用您的“手动”检查方法:

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)) && 
                !Character.toString(source.charAt(i)).equals("_") && 
                !Character.toString(source.charAt(i)).equals("-")) 
            { 
                return ""; 
            } 
        } 
        return null; 
    } 
}; 

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

或另一种方法:在创建 EditText 的 XML 中设置允许的字符:

<EditText 
  android:inputType="text" 
  android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm,_,-" 
  android:hint="Only letters, digits, _ and - allowed" />
于 2013-01-07T08:26:06.300 回答
19
<EditText 
  android:inputType="text" 
  android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm,_,-" 
  android:hint="Only letters, digits, _ and - allowed"
/>

上面的代码还将另外包含,以避免,使用下面的代码

<EditText 
  android:inputType="text" 
  android:digits="0123456789qwertzuiopasdfghjklyxcvbnm_-"
  android:hint="Only letters, digits, _ and - allowed"
/>
于 2013-12-17T09:02:42.450 回答
13

这可能很有用,特别是如果您的 EditText 应该允许变音符号(在我的情况下是葡萄牙语变音符号):

<EditText
   android:digits="0123456789AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZzÁáÂâÃãÀàÇçÉéÊêÍíÓóÔôÕõÚú"
/>
于 2016-09-02T19:05:31.303 回答
4

类似于 , 的解决方案android:digits="0123456789*"是使用这个:

EditText etext = new EditText(this);
etext.setKeyListener(DigitsKeyListener.getInstance("0123456789*"));

一个额外的好处是它还显示数字键盘。

于 2017-07-17T22:57:59.307 回答
2
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.toString(source.charAt(i)).matches("[a-zA-Z0-9-_]+")) {
                return "";
                edittext.setError("Only letters, digits, _ and - allowed");
            }
        }
        return null;
    }
};
edittext.setFilters(new InputFilter[] { filter });
于 2020-02-18T13:34:39.277 回答
1

试试这个:

public static SpannableStringBuilder getErrorMsg(String estring) {
        int ecolor = Color.BLACK; // whatever color you want
        ForegroundColorSpan fgcspan = new ForegroundColorSpan(ecolor);
        SpannableStringBuilder ssbuilder = new SpannableStringBuilder(estring);
        ssbuilder.setSpan(fgcspan, 0, estring.length(), 0);
        return ssbuilder;
    }

然后setError()当你想显示“只允许字母和数字”时到 EditText,如下所示。

etPhone.setError(getErrorMsg("Only lowercase letters and numbers are allowed!"));

希望这会帮助你。我在我的应用程序的 EditText 中使用相同的验证检查。

于 2013-01-07T08:36:36.113 回答
1

请尝试添加android:digits="abcde.....012345789"属性?尽管 android:digits 指定它是一个数字字段,但我确实可以将其设置为接受字母和特殊字符(在 SDK-7 上测试)

于 2013-01-07T08:39:50.967 回答
0

使用这 2 个功能

public static boolean isdigit(EditText input)
    {

    String data=input.getText().toString().trim();
    for(int i=0;i<data.length();i++)
    {
         if (!Character.isDigit(data.charAt(i)))
                return false;

    }
    return true;
    }

    public static boolean ischar(EditText input)
    {

    String data=input.getText().toString().trim();
    for(int i=0;i<data.length();i++)
    {
         if (!Character.isDigit(data.charAt(i)))
                return true;

    }
    return false;
    }

在这些函数中传递 Edittext 变量 .. 所以你可以有布尔值。

于 2013-01-07T09:03:18.123 回答
0

您可以通过两种方式验证这一点,两者都对我有用,希望对您也有帮助。

1> 在您的 edittext 中提及字符。

android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm,_,-" 

2> 可以务实地验证 milos务实地回答

于 2019-01-28T09:50:52.033 回答