如何限制EditText只接受字母数字字符

时间:2014-04-22 06:50:05

标签: android validation android-edittext

如何限制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>

如果用户键入小写&#34; abcd&#34;,EditText应自动显示大写&#34; ABCD&#34;无需将键盘限制为大写。

14 个答案:

答案 0 :(得分:111)

在XML中,添加:

 android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "

答案 1 :(得分:22)

  

如何限制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

另外,在设置InputFilters时,您必须确保不要覆盖EditText上设置的其他android:maxLength;这些可以用XML设置,如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); 已经存在,因此应用我们的字母数字过滤器将保留所有字母数字文本,并将其转换为大写。

var object1 = {
        "11": { "id": 11, "parent_product": 0, "product_name": "WebStore", "product_price_city": null, "child": { "12": { "id": 12, "parent_product": 11, "product_name": "WebStore - Single", "product_price_city": 500 },
        "13": { "id": 13, "parent_product": 11, "product_name": "WebStore - Full", "product_price_city": 2500 } } },
        "15": { "id": 15, "parent_product": 0, "product_name": "WebStore", "product_price_city": null, "child": undefined },
        "17": { "id": 17, "parent_product": 0, "product_name": "WebStore", "product_price_city": null }
    },
    key;

function getParent(id, object) {
    var k;
    Object.keys(object).some(function (a) {
        if (object[a].child && id in object[a].child) {
            k = a;
            return true;
        }
    });
    return k;
}

document.write(getParent('12', object1) + '<br>'); // '11'
key = getParent('42', object1);
if (typeof key === 'undefined') {
    document.write('no key found');
}

答案 2 :(得分:10)

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

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

这应该可以使用Caps&amp; amp;小写字母。

答案 3 :(得分:8)

使用此:

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

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

答案 4 :(得分:4)

试试这个:

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 "";
                    }
                }
        });
    }

答案 5 :(得分:4)

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

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

经过测试,完美适用于PAN卡验证。

答案 6 :(得分:2)

极简主义的科特林方法:

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

答案 7 :(得分:1)

为此你需要创建自定义过滤器并像这样设置为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文件中设置其他参数。

答案 8 :(得分:1)

这对我有用:

android:inputType="textVisiblePassword"

答案 9 :(得分:1)

以编程方式执行此操作:

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)设置时,其中许多都表现得很奇怪。使用此设置,它会从输入文本中删除一个字符。此代码也解决了这个问题。

答案 10 :(得分:0)

<EditText
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:hint="PromoCode"
                    android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
                    android:inputType="text" />

答案 11 :(得分:0)

我尝试了@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 ""
    }
)

}

答案 12 :(得分:-1)

一行回答

XML添加此textAllCaps =“true”

在onCreate()

上执行此操作

适用于小写&amp;允许空格的大写

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

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

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

允许空格的大写

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

答案 13 :(得分:-1)

private static final int MAX_LENGTH =13;

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

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

相关问题