Как исключить специальные символы из клавиатуры Android для EditText - PullRequest
17 голосов
/ 07 сентября 2011

Привет, я хочу показать только цифры и символы на клавиатуре для EditText в Android, я пытался добавить атрибут android:inputType = text|number, но он не работал.

Пожалуйста, помогите мне с любым другим лучшим предложением.заранее спасибо.

Ответы [ 7 ]

31 голосов
/ 07 сентября 2011

Используйте фильтр для этого. Здесь я добавляю код для фильтра.

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}); 
21 голосов
/ 07 сентября 2011

попробуйте добавить параметр digits в ваш editText:

android:digits="abcde.....012345789"
4 голосов
/ 16 июня 2017

Если вы хотите добавить пробелы, вы можете указать пробел после последней цифры.

 android:digits="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 "
1 голос
/ 19 апреля 2018

Решение с 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 для каждого вызова метода с допустимыми символами,

0 голосов
/ 21 марта 2018

Ожидаемое решение - запретить пользователю вводить специальные символы с клавиатуры.

В приведенном ниже решении используется RegX, но он добавляется в файл strings.xml, поэтому об этом позаботятся при создании многоязычного xmls.

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 голосов
/ 12 августа 2017

Работает Ограничить спецсимвол в тексте редактирования

    private EditText your_editText ;
    private String blockCharacters = "(~*#^|$%&!";

    private InputFilter filter = new InputFilter() {

        @Override
        public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {

            if (source != null && blockCharacters.contains(("" + source))) {
                return "";
            }
            return null;
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        your_editText = (EditText) findViewById(R.id.your_editText);
        your_editText .setFilters(new InputFilter[] { filter });
    }

}
0 голосов
/ 18 августа 2016
  //大兄弟,这么做就可以了。 
  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;
}
...