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

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

Ответы [ 16 ]

177 голосов
/ 09 декабря 2010

Я нашел это на другом форуме. Работает как чемпион.

InputFilter filter = new InputFilter() {
    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;
    }
};
edit.setFilters(new InputFilter[] { filter });
130 голосов
/ 30 сентября 2012

InputFilters немного сложнее в версиях Android, которые отображают предложения словаря. Иногда вы получаете SpannableStringBuilder, иногда простую строку в параметре source.

Следующий InputFilter должен работать. Не стесняйтесь улучшать этот код!

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

        if (source instanceof SpannableStringBuilder) {
            SpannableStringBuilder sourceAsSpannableBuilder = (SpannableStringBuilder)source;
            for (int i = end - 1; i >= start; i--) { 
                char currentChar = source.charAt(i);
                 if (!Character.isLetterOrDigit(currentChar) && !Character.isSpaceChar(currentChar)) {    
                     sourceAsSpannableBuilder.delete(i, i+1);
                 }     
            }
            return source;
        } else {
            StringBuilder filteredStringBuilder = new StringBuilder();
            for (int i = start; i < end; i++) { 
                char currentChar = source.charAt(i);
                if (Character.isLetterOrDigit(currentChar) || Character.isSpaceChar(currentChar)) {    
                    filteredStringBuilder.append(currentChar);
                }     
            }
            return filteredStringBuilder.toString();
        }
    }
}
102 голосов
/ 14 декабря 2012

намного проще:

<EditText
    android:inputType="text"
    android:digits="0,1,2,3,4,5,6,7,8,9,*,qwertzuiopasdfghjklyxcvbnm" />
62 голосов
/ 02 декабря 2013

Ни один из опубликованных ответов не работал для меня. Я пришел со своим собственным решением:

InputFilter filter = new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        boolean keepOriginal = true;
        StringBuilder sb = new StringBuilder(end - start);
        for (int i = start; i < end; i++) {
            char c = source.charAt(i);
            if (isCharAllowed(c)) // put your condition here
                sb.append(c);
            else
                keepOriginal = false;
        }
        if (keepOriginal)
            return null;
        else {
            if (source instanceof Spanned) {
                SpannableString sp = new SpannableString(sb);
                TextUtils.copySpansFrom((Spanned) source, start, sb.length(), null, sp, 0);
                return sp;
            } else {
                return sb;
            }           
        }
    }

    private boolean isCharAllowed(char c) {
        return Character.isLetterOrDigit(c) || Character.isSpaceChar(c);
    }
}
editText.setFilters(new InputFilter[] { filter });
23 голосов
/ 04 ноября 2014

Используйте эту свою работу на 100% по вашему желанию и очень просто.

<EditText
android:inputType="textFilter"
android:digits="@string/myAlphaNumeric" />

В strings.xml

<string name="myAlphaNumeric">abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789</string>
15 голосов
/ 13 марта 2015

Чтобы избежать использования специальных символов в типе ввода

public static InputFilter filter = new InputFilter() {
    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String blockCharacterSet = "~#^|$%*!@/()-'\":;,?{}=!$^';,?×÷<>{}€£¥₩%~`¤♡♥_|《》¡¿°•○●□■◇◆♧♣▲▼▶◀↑↓←→☆★▪:-);-):-D:-(:'(:O 1234567890";
        if (source != null && blockCharacterSet.contains(("" + source))) {
            return "";
        }
        return null;
    }
};

Вы можете установить фильтр для текста редактирования, как показано ниже

edtText.setFilters(new InputFilter[] { filter });
7 голосов
/ 16 января 2011

В дополнение к принятому ответу также можно использовать, например: android:inputType="textCapCharacters" в качестве атрибута <EditText>, чтобы принимать только символы верхнего регистра (и цифры).

5 голосов
/ 23 апреля 2014

Верно, лучший способ исправить это в самом XML-макете, используя:

<EditText
android:inputType="text"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" />

как справедливо указал Флориан Фрёлих, он хорошо работает даже при просмотре текста.

<TextView
android:inputType="text"
android:digits="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" />

Просто предостережение, символы, упомянутые в android:digits, будут отображаться только, поэтому будьте осторожны, чтобы не пропустить ни одного набора символов:)

5 голосов
/ 02 октября 2013

По какой-то причине конструктор класса android.text.LoginFilter имеет пакетную область, поэтому вы не можете напрямую расширять его (даже если он будет идентичен этому коду). Но вы можете расширить LoginFilter.UsernameFilterGeneric! Тогда у вас просто есть это:

class ABCFilter extends LoginFilter.UsernameFilterGeneric {
    public UsernameFilter() {
        super(false); // false prevents not-allowed characters from being appended
    }

    @Override
    public boolean isAllowed(char c) {
        if ('A' <= c && c <= 'C')
            return true;
        if ('a' <= c && c <= 'c')
            return true;

        return false;
    }
}

Это на самом деле не задокументировано, но это часть базовой библиотеки, а источник прост . Я уже давно пользуюсь им, пока проблем нет, хотя признаюсь, что не пытался сделать что-либо сложное с использованием spannables.

4 голосов
/ 19 октября 2013

Это простое решение работало для меня, когда мне нужно было запретить пользователю вводить пустые строки в EditText. Конечно, вы можете добавить больше символов:

InputFilter textFilter = new InputFilter() {

@Override

public CharSequence filter(CharSequence c, int arg1, int arg2,

    Spanned arg3, int arg4, int arg5) {

    StringBuilder sbText = new StringBuilder(c);

    String text = sbText.toString();

    if (text.contains(" ")) {    
        return "";   
    }    
    return c;   
    }   
};

private void setTextFilter(EditText editText) {

    editText.setFilters(new InputFilter[]{textFilter});

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