development

영숫자 문자 만 허용하도록 EditText를 제한하는 방법

big-blog 2020. 12. 6. 21:49
반응형

영숫자 문자 만 허용하도록 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"를 표시해야합니다.


XML에서 다음을 추가하십시오.

 android:digits="abcdefghijklmnopqrstuvwxyz1234567890 "

사용자가 입력하는 소문자 또는 대문자 키에 관계없이 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. 이것들은 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);

많은 사용자 정의를 원하지 않는 경우 Android에 추가하려는 모든 문자가 포함 된 위의 간단한 트릭이 실제로 있습니다.

android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"

이것은 대문자 및 소문자로 된 영숫자 값을 허용하도록 작동합니다.


이것을 사용하십시오 :

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

textAllCaps="true"이 질문에 대한 답변에 대한 의견에서 제안한대로 사용해 보았지만 예상대로 작동하지 않았습니다.


이 시도:

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

이에 대한 정규 표현식을 작성하지 않으려면 편집 텍스트에 XML 속성을 추가하면됩니다.

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

PAN 카드 유효성 검사를 위해 완벽하게 작동하는 것으로 테스트되었습니다.


미니멀리스트 Kotlin 접근 방식 :

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

이를 위해 사용자 지정 필터를 만들고 이와 같이 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 파일에 설정할 추가 매개 변수가 없습니다.


이것은 나를 위해 작동합니다.

android:inputType="textVisiblePassword"


프로그래밍 방식으로 다음을 수행하십시오.

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

Note that the call to setInputType is necessary so that we are sure that the input variable is always the last character given by the user.

I have tried other solutions discussed here in SO. But many of them were behaving weird in some cases such as when you have Quick Period (Tap space bar twice for period followed by space) settings on. With this setting, it deletes one character from your input text. This code solves this problem as well.


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

one line answer

XML Add this textAllCaps="true"

do this onCreate()

for lower case & upper case with allowing space

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

for lower case with allowing space (Required answer for this question)

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

for upper case with allowing space

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

참고URL : https://stackoverflow.com/questions/23212439/how-to-restrict-the-edittext-to-accept-only-alphanumeric-characters

반응형