InputFilter удаляет весь текст - PullRequest
       11

InputFilter удаляет весь текст

1 голос
/ 25 февраля 2020

Я ввел 3 буквы алфавита android очищает ввод. Я ожидал удалить последний, третий символ, а не полный текст

enter image description here

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

private final Integer mAlphabetCount = 2;

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

    String text = createResultString(source, start, end, dest, dstart, dend);

    if (text.length() <= mAlphabetCount) {
        for (int i = start; i < end; i++) {
            if (!Character.isLetter((source.charAt(i)))) {
                return "";
            }
        }
        return null;
    }

    char[] digit = text.substring(2).toCharArray();
    for (char c : digit) {
        if (!Character.isDigit(c)) {
            return "";
        }
    }

    return source;
}

private String createResultString(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
    String sourceString = source.toString();
    String destString = dest.toString();
    return destString.substring(0, dstart) + sourceString.substring(start, end) + destString.substring(dend);
}

Ответы [ 2 ]

0 голосов
/ 02 марта 2020

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

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 (i < mAlphabetCount) {
                if (!Character.isLetter(currentChar)) {
                    sourceAsSpannableBuilder.delete(i, i + 1);
                }
            } else {
                if (!Character.isDigit(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 (dest.length() < mAlphabetCount) {
                if (Character.isLetter(currentChar)) {
                    filteredStringBuilder.append(currentChar);
                }
            } else {
                if (Character.isDigit(currentChar)) {
                    filteredStringBuilder.append(currentChar);
                }
            }
        }
        return filteredStringBuilder.toString();
    }
}
0 голосов
/ 25 февраля 2020

ОБНОВЛЕНО

Прежде всего вам необходимо решить, что вы хотите сделать в случае неправильного ввода данных пользователем. Например, пользователь уже ввел «AB» и теперь пытается ввести «C». Вы хотите отказаться от "C"? Вы хотите, чтобы поле ввода стало "B C"? Допустим, вы хотите отказаться от "C".

Проверьте, является ли source экземпляром Spanned. Если это так, то вы не можете просто отправить обратно пустую строку, если ввод неверен, или он сотрет текстовое поле (это происходит с вами сейчас). Вам необходимо извлечь правильную часть из source и отправить ее обратно. Поскольку мы решили просто отбросить все буквы после первых 2, вы можете попытаться сопоставить source с ^([a-zA-Z]{0,2})(?:[^\d]*)(\d{0,7}). Затем отправьте обратно результат, составленный из соответствующей группы 1 + группа 2, то есть первые 2 буквы + первые 7 цифр.

Если source не является экземпляром Spanned, вы можете проверить, соответствует ли dest + source ^[a-zA-Z]{0,2}\d{0,7}$. Если да, отправьте обратно null, в противном случае отбросьте ввод - верните пустую строку.

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