Android - средство наблюдения за текстом EditText показывает неверные значения, если текст начинается со специального символа, такого как @ или #

У меня есть текст редактирования. Я добавил наблюдателя за текстом в edittext. Я слушаю изменения текста. Если ввод слова начинается с @, я показываю пользовательские предложения (например, когда вы вводите @, а Twitter показывает вам предложения)

Если текст начинается с обычной буквы, все работает нормально.

Например:

hello @random_user how are you
 @this also works because there is an empty space before '@'

Этот пример работает.

Однако, если текст начинается со специальных символов, Text Watcher показывает неверные значения. Например:

@hello_user

#someHashtag

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

@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
    //Text in edittext is '@user' but I get:
    //start = 0, before = 0 and count = 1;
    //edittext.getSelectionStart() also returns 1 but cursor is at the end of the line.
    //edittext.getText().toString().length() also returns 1 but @user is 5 length.
}

Как я могу это решить?

Изменить: edittext.postdesc.getText().toString() возвращает только первый символ. Например, если мой текст '@user', метод getText возвращает только @


person UzaySan    schedule 28.10.2020    source источник


Ответы (1)


Вы можете попробовать этот обходной путь:

class TextWatcherExtended(
    private val onTextChanged: (text: CharSequence?, start: Int, before: Int, count: Int) -> Unit
) : TextWatcher {
    private var before = 0
    override fun afterTextChanged(s: Editable?) {
    }

    override fun beforeTextChanged(text: CharSequence?, start: Int, count: Int, after: Int) {
        this.before = text?.length ?: 0
    }

    override fun onTextChanged(text: CharSequence?, start: Int, before: Int, count: Int) {
        onTextChanged.invoke(text, start, this.before, count)
    }
}
person Dmitrii Motpan    schedule 14.03.2021