영숫자 문자 만 허용하도록 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 "));
'development' 카테고리의 다른 글
jQuery에서 배열을 복제하는 방법이 있습니까? (0) | 2020.12.06 |
---|---|
Visual Studio 2012 Web API 프로젝트가 실행되지 않음-Newtonsoft.Json을 찾을 수 없음 (0) | 2020.12.06 |
내 Mac에서 xcode 버전을 기본값으로 설정하는 방법은 무엇입니까? (0) | 2020.12.06 |
'is'키워드는 파이썬에서 어떻게 구현됩니까? (0) | 2020.12.06 |
값 C #을 가장 가까운 정수로 반올림하는 방법은 무엇입니까? (0) | 2020.12.06 |