こんにちはAndroidのEditTextのキーパッドに数字と文字のみを表示したいのですが、属性Android:inputType = text|number
を追加しようとしましたが、機能しませんでした。
他のより良い提案で私を助けてください。前もって感謝します。
editTextにdigitsパラメーターを追加してみてください。
Android:digits="abcde.....012345789"
そのためのフィルターを使用してください。ここでは、フィルターのコードを追加しています。
EditText etName = (EditText)findViewById(R.id.etName);
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (!Character.isLetterOrDigit(source.charAt(i))) {
return "";
}
}
return null;
}
};
etName.setFilters(new InputFilter[]{filter});
スペースを追加したい場合は、最後の桁の後にスペースを入れることができます。
Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "
ここで提供されているInputFilter
のソリューションは、無効な文字のすぐ隣にある場合、入力からいくつかの有効な文字を置き換えて破棄するため、100%正しくありません。
たとえば、すべての特殊文字を除外する必要があり、テキストを入力します:olala [
EditTextフィールドは、olala[
文全体をフィルターに渡し、戻り値は ""になります。これは、有効なolalaもスローすることを意味します。
これが私の解決策です:
InputFilter filter = (source, start, end, dest, dstart, dend)->{
for (int i = start; i < end; i++) {
char symbol = source.charAt(i);
if (!isValidCharacter(symbol)) {
StringBuilder buf = new StringBuilder();
for(int j = start; j < end; j++)
{
symbol = source.charAt(j);
if(isValidCharacter(symbol)) buf.append(symbol);
}
return buf.toString();
}
}
return null;
};
有効な文字を使用するすべてのメソッド呼び出しに対してStringBuilderのメモリ割り当てを回避するために、ここでは二重ループが必要です。
//大兄弟,这么做就可以了。
InputFilter filter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end,
Spanned dest, int dstart, int dend) {
for (int i = start; i < end; i++) {
if (isChineseChar(source.charAt(i))) {
return "";
}
}
return null;
}
};
etName.setFilters(new InputFilter[]{filter});
//一条简单的规则。
private static boolean isChineseChar(char c) {
Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS;
}
予想される解決策は、ユーザーがキーボードから特殊文字を入力できないようにすることです。
以下のソリューションはRegXを使用しますが、それをstrings.xmlファイルに追加して、多言語xmlの作成時に処理されるようにします。
Strings.xml
<string name="alpha_numeric_regx">[a-zA-Z 0-9]+</string>
ソースファイル
//Extracting forehand to avoid multiple calls to getString from Filter
String alphaNumericRegX = getString(R.string.alpha_numeric_regx);
mEditTextOtp.setFilters(new InputFilter[]{(source, start, end, dest, dStart, dEnd) -> {
for (int i = 0; i < source.length(); i++) {
if (source.equals("")) {
return source;
}
if (source.toString().matches(alphaNumericRegX)) {
return source;
}
return "";
}
return null;
}});
これが問題を解決することを願っています。新しい人のために。 :)