Как использовать TextWatcher для проверки определенной строки символов вместо одного символа?

Я новичок в Android и Java. Мое приложение должно иметь возможность проверять, что пользователь печатает, когда он это печатает. Если пользователь вводит заранее определенное слово, которое было помечено флажком, событие должно произойти до того, как пользователь нажмет кнопку. Кажется, что лучшим выбором для этого будут TextWatcher и addChangedTextListener. Я не смог понять, как заставить его проверять последовательность символов (слово). Например, если помеченное слово было «очень», когда пользователь вводит «Очень тепло». в тексте редактирования программа должна иметь возможность распознавать, что было введено слово «очень», и каким-то образом предупреждать пользователя.

Я надеюсь, что смог прояснить это без использования кода. Любая помощь, которая может быть оказана, будет принята с благодарностью.


person ghodnett    schedule 07.04.2012    source источник


Ответы (2)


Это самый простой способ сделать это с помощью TextWatcher:

String word = "very";

TextWatcher watcher = new TextWatcher() {
    public void onTextChanged(CharSequence s, int start, int before, int count) {
    }

    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }

    public void afterTextChanged(Editable s) {
        String tmp = s.toString().trim().toLowerCase();
        if(tmp.contains(word.toLowerCase())){
            //inform the user here
        }
    }
};
person waqaslam    schedule 07.04.2012
comment
Итак, есть ли способ изменить этот код, чтобы он одновременно проверял наличие нескольких помеченных слов? Теперь моя проблема в том, что у меня будет неизвестное количество помеченных слов, возможно, сохраненных в хэш-карте, и мне нужно будет определить, использует ли пользователь какое-либо из этих слов. - person ghodnett; 08.04.2012
comment
да, используйте цикл внутри afterTextChanged, чтобы сделать это для нескольких слов - person waqaslam; 08.04.2012

Я просто покажу пример:

String word = "very";
int wordProgress = 0;

charTyped(char c) {
    if (c == word.charAt(wordProgress)) {
        wordProgress++;
        if (wordProgress >= word.length()) {
            AlertUserThatFlagWordWasTypedAndUseObjectiveCTypeMethodNamingSyntaxJustForFunBecauseIAmUsingObjectiveCAndIFindItQuiteAnoying(word);
        }
    }
}

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

Гораздо более простая версия, которая также будет работать с возвратом и перемещением курсора, но будет гораздо менее эффективной, будет заключаться в проверке, содержит ли вся текстовая область слово каждый раз, когда пользователь что-то печатает.

person Stas Jaro    schedule 07.04.2012
comment
Спасибо. Так мне вообще не нужен TextWatcher или это должно быть внутри этого? - person ghodnett; 08.04.2012
comment
Я никогда не использовал TextWatcher, но из вашего описания я предполагаю, что у вас будет метод, аналогичный charTyped (char c). Этот метод будет вызываться каждый раз при вводе символа. - person Stas Jaro; 08.04.2012