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
セットを上書きしないようにする必要があります。これらは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);
カスタマイズがあまり必要ない場合は、Android:digitsに追加するすべての文字を使用した上記のトリックを実際に使用してください。
Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
これは、大文字と小文字を含む英数字の値を受け入れるように機能するはずです。
これを使って:
Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"
Android:inputType="textCapCharacters"
この質問に対する受け入れられた回答のコメントで示唆されているように、textAllCaps="true"
を使用しようとしましたが、期待どおりに機能しませんでした。
このために正規表現を書きたくない場合は、編集テキストにXMLプロパティを追加するだけです。
Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
Android:inputType="textCapCharacters"
PANカードの検証のために完全に動作することをテストしました。
これを試して:
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 "";
}
}
});
}
ミニマリストコトリンアプローチ:
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ファイルに設定する追加のパラメーターはありません。
プログラムで、これを行います:
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文字が削除されます。このコードはこの問題も解決します。
これは私のために働く:
Android:inputType="textVisiblePassword"
<EditText
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:hint="PromoCode"
Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789,_,-"
Android:inputType="text" />