web-dev-qa-db-ja.com

EditTextのAndroidキーパッド)から特殊文字を除外する方法

こんにちはAndroidのEditTextのキーパッドに数字と文字のみを表示したいのですが、属性Android:inputType = text|numberを追加しようとしましたが、機能しませんでした。

他のより良い提案で私を助けてください。前もって感謝します。

20
Jes

editTextにdigitsパラメーターを追加してみてください。

Android:digits="abcde.....012345789"
21
Dyonisos

そのためのフィルターを使用してください。ここでは、フィルターのコードを追加しています。

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}); 
31
Aju

スペースを追加したい場合は、最後の桁の後にスペースを入れることができます。

 Android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "
4
Thirupathi

ここで提供されている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のメモリ割り当てを回避するために、ここでは二重ループが必要です。

2
  //大兄弟,这么做就可以了。 
  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;
}
0
dong sheng

予想される解決策は、ユーザーがキーボードから特殊文字を入力できないようにすることです。

以下のソリューションは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;
        }});

これが問題を解決することを願っています。新しい人のために。 :)

0