Переместите курсор на следующую строку в MultiLine EditText после повторного присоединения TextWatcher - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь реализовать IDE кодирования в приложении для Android.Я создал многострочный EditText для написания кода. Чтобы изменить цвета ключевых слов, я заменяю текст в методе TextWatcher afterTextChanged().Проблема в том, что при вводе ввода курсор не перемещается на следующую строку.Если я удалю приведенный ниже код, все будет нормально (печатать и переходить на новые строки).

@Override
public void afterTextChanged(Editable s) {
    String replaceText = codeEditText.getText().toString();
    // Some logic that changes contents of replaceText
    codeEditText.removeTextChangedListener(this);
    codeEditText.setText(Html.fromHtml(replaceText));
    codeEditText.setSelection(codeEditText.length(), codeEditText.length());
    codeEditText.addTextChangedListener(this);
}

Я также пытался использовать s.replace(0, s.length(), Html.fromHtml(replaceText));, но он тоже не работает.Есть ли лучший способ изменить значение EditText из TextWatcher, кроме двух вышеупомянутых (detaching-reattaching, s.replace).

1 Ответ

0 голосов
/ 01 июля 2019

Если у кого-то есть подобные проблемы или он заинтересован -

Я выяснил, что проблема не в слушателе, а в части разбора HTML.Html.fromHtml() имеет проблемы с \n символами.Даже после замены всех тегов \n на теги <br> ошибка не исчезла.После перехода к подходу, в котором я использовал SpannableStringBuilder для изменения цвета ключевых слов, все стало на свои места.

@Override
public void afterTextChanged(Editable s) {
    SpannableStringBuilder ssb = new SpannableStringBuilder(s.toString());

    for (int i = 0; i<keyWords.size(); i++){
        String keyword = keyWords.get(i);
        Pattern pattern = Pattern.compile("\\b"+keyword+"\\b");
        Matcher matcher = pattern.matcher(ssb);
        while(matcher.find()){
            // Have to create a new instance of FgColor for this to work!!
            // KeywordColors is a Hashmap mapping keywords to the color they should be highlighted with
            ForegroundColorSpan fg = new ForegroundColorSpan(keywordColors.get(keyword).getForegroundColor());
            ssb.setSpan(fg, matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
    }

    codeEditText.removeTextChangedListener(this);
    codeEditText.setText(ssb);
    codeEditText.addTextChangedListener(this);

    codeEditText.setSelection(codeEditText.getText().length());

}

Еще одна вещь, которую я заметил, когда я использовал один FGspan для нескольких слов, только последнее слово, к которому он был применен, на самом деле раскрашивалось.Чтобы решить эту проблему, создайте новые экземпляры FGspan для каждого нового слова, которое нужно выделить.

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