web-dev-qa-db-ja.com

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>

ユーザーが小文字の「abcd」と入力すると、キーボードを大文字に制限する必要なく、EditTextに大文字の「ABCD」が自動的に表示されます。

57
user3472001

XMLで、これを追加します。

 Android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "
116
Hashir Sheikh

ユーザーが入力している小文字または大文字のキーが何であれ、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);
22
Steven Byle

カスタマイズがあまり必要ない場合は、Android:digitsに追加するすべての文字を使用した上記のトリックを実際に使用してください。

Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

これは、大文字と小文字を含む英数字の値を受け入れるように機能するはずです。

12
Ajeet Singh

これを使って:

Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Android:inputType="textCapCharacters"

この質問に対する受け入れられた回答のコメントで示唆されているように、textAllCaps="true"を使用しようとしましたが、期待どおりに機能しませんでした。

8
thetanuj

このために正規表現を書きたくない場合は、編集テキストにXMLプロパティを追加するだけです。

Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
Android:inputType="textCapCharacters"

PANカードの検証のために完全に動作することをテストしました。

6
saigopi

これを試して:

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
Gal Rom

ミニマリストコトリンアプローチ:

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

そのためには、カスタムフィルターを作成し、このように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ファイルに設定する追加のパラメーターはありません。

1
Biraj Zalavadia

プログラムで、これを行います:

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でここで説明した他のソリューションを試しました。しかし、それらの多くは、Quick Period (Tap space bar twice for period followed by space)設定がオンになっている場合など、場合によっては奇妙な動作をしていました。この設定では、入力テキストから1文字が削除されます。このコードはこの問題も解決します。

1
user1506104

これは私のために働く:

Android:inputType="textVisiblePassword"

1
edwardaa
<EditText
                    Android:layout_width="match_parent"
                    Android:layout_height="wrap_content"
                    Android:hint="PromoCode"
                    Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
                    Android:inputType="text" />
0
Amir De