Как я могу использовать InputFilter для ограничения символов в EditText в Android? - PullRequest
164 голосов
/ 28 июля 2010

Я хочу ограничить символы только 0-9, a-z, A-Z и пробел. Задание типа ввода Я могу ограничиться цифрами, но не могу понять, как Inputfilter просматривает документы.

Ответы [ 16 ]

1 голос
/ 12 декабря 2017

Это старая ветка, но у всех намеченных решений есть проблемы (в зависимости от устройства / версии Android / клавиатуры).

РАЗЛИЧНЫЙ ПОДХОД

Так что в конце концов япошел с другим подходом, вместо использования проблемной реализации InputFilter, я использую TextWatcher и TextChangedListener EditText.

ПОЛНЫЙ КОД (ПРИМЕР)

editText.addTextChangedListener(new TextWatcher() {

    @Override
    public void afterTextChanged(Editable editable) {
        super.afterTextChanged(editable);

        String originalText = editable.toString();
        int originalTextLength = originalText.length();
        int currentSelection = editText.getSelectionStart();

        // Create the filtered text
        StringBuilder sb = new StringBuilder();
        boolean hasChanged = false;
        for (int i = 0; i < originalTextLength; i++) {
            char currentChar = originalText.charAt(i);
            if (isAllowed(currentChar)) {
                sb.append(currentChar);
            } else {
                hasChanged = true;
                if (currentSelection >= i) {
                    currentSelection--;
                }
            }
        }

        // If we filtered something, update the text and the cursor location
        if (hasChanged) {
            String newText = sb.toString();
            editText.setText(newText);
            editText.setSelection(currentSelection);
        }
    }

    private boolean isAllowed(char c) {
        // TODO: Add the filter logic here
        return Character.isLetter(c) || Character.isSpaceChar(c);
    }
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {
        // Do Nothing
    }

    @Override
    onTextChanged(CharSequence s, int start, int before, int count) {
        // Do Nothing
    }
});

Причина, по которой InputFilter не является хорошим решением в Android, заключается в том, что он зависит от реализации клавиатуры.Ввод с клавиатуры фильтруется перед тем, как ввод передается в EditText.Но поскольку некоторые клавиатуры имеют разные реализации для вызова InputFilter.filter(), это проблематично.

С другой стороны, TextWatcher не заботится о реализации клавиатуры, это позволяет нам создать простое решение иуверен, что он будет работать на всех устройствах.

1 голос
/ 23 сентября 2014

, чтобы запретить слова в тексте редактирования.создайте класс, который вы могли бы использовать в любое время.

public class Wordfilter implements InputFilter
{
    @Override
    public CharSequence filter(CharSequence source, int start, int end,Spanned dest, int dstart, int dend) {
        // TODO Auto-generated method stub
        boolean append = false;
        String text = source.toString().substring(start, end);
        StringBuilder str = new StringBuilder(dest.toString());
        if(dstart == str.length())
        {
            append = true;
            str.append(text);
        }
        else
            str.replace(dstart, dend, text);
        if(str.toString().contains("aaaaaaaaaaaa/*the word here*/aaaaaaaa"))
        {
            if(append==true)
                return "";
            else
                return dest.subSequence(dstart, dend);
        }
        return null;
    }
}
1 голос
/ 08 августа 2014

Не обращая внимания на материал span, с которым сталкивались другие люди, чтобы правильно обрабатывать предложения словаря, я нашел следующий код работ

Источник растет с увеличением предложения, поэтому мы должны посмотреть, сколько символов он на самом деле ожидает от нас, прежде чем мы что-нибудь вернем.

Если у нас нет недопустимых символов, верните null, чтобы произошла замена по умолчанию.

В противном случае нам нужно извлечь действительные символы из подстроки, которая фактически будет помещена в EditText.

InputFilter filter = new InputFilter() { 
    public CharSequence filter(CharSequence source, int start, int end, 
    Spanned dest, int dstart, int dend) { 

        boolean includesInvalidCharacter = false;
        StringBuilder stringBuilder = new StringBuilder();

        int destLength = dend - dstart + 1;
        int adjustStart = source.length() - destLength;
        for(int i=start ; i<end ; i++) {
            char sourceChar = source.charAt(i);
            if(Character.isLetterOrDigit(sourceChar)) {
                if(i >= adjustStart)
                     stringBuilder.append(sourceChar);
            } else
                includesInvalidCharacter = true;
        }
        return includesInvalidCharacter ? stringBuilder : null;
    } 
}; 
1 голос
/ 28 июля 2010

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

Интерфейс InputFilter имеет один метод, filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend), и предоставляет вам всю необходимую информацию о том, какие символы были введены в текст редактирования, которому он назначен.

После того, как выСоздав свой собственный InputFilter, вы можете назначить его EditText, вызвав setFilters (...).

http://developer.android.com/reference/android/text/InputFilter.html#filter(java.lang.CharSequence, int, int, android.text.Spanned, int, int)

0 голосов
/ 21 мая 2014

если вы хотите включить пробел в свой ввод, а затем добавьте пробел в android: цифровой код, как показано выше.

У меня отлично работает даже в версии выше android 4.0.

наслаждайся:)

0 голосов
/ 12 декабря 2011

Можно использовать setOnKeyListener. В этом методе мы можем настроить ввод edittext!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...