Я использую элемент управления EditText, для которого разрешено форматирование текста (жирный, курсив и т. д.).
Чтобы применить форматирование, в обработчике событий AfterTextChanged моего TextWatcher я определяю, был ли стиль форматирования, например полужирный, включен через пользовательский интерфейс. Если это так, я пробовал два разных подхода, ни один из которых не является удовлетворительным по разным причинам:
Подход 1
textView.EditableText.SetSpan(new StyleSpan(TypefaceStyle.Bold), start, end, SpanTypes.ExclusiveExclusive);
Для значения start я пробовал использовать _textView.SelectionStart - 1 или начальную позицию при первом применении StyleSpan. А для end значение _textView.SelectionStart.
Хотя при использовании этого метода текст выглядит нормально отформатированным, он создает ненужные StyleSpans, когда достаточно одного. Это становится ясно, когда я пытаюсь сохранить текст в своей локальной базе данных через преобразование Html:
string html = Html.ToHtml(new SpannableString(Fragment_Textarea.Instance().Textarea().EditableText));
Например, вместо <b>this is bold text</b>
я получаю <b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b><b>this is bold text</b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b></b>
. Итак, ясно, что я делаю что-то неправильно/неэффективен в этом подходе. Очевидно, что это приводит к возможным замедлениям как при вводе текста, так и при извлечении при запуске.
Что-то, что я рассмотрел, это проверить, есть ли диапазон на предыдущем символе (_textView.SelectionStart - 1
), и, если да, удалить диапазон, а затем добавить диапазон, который начинается с этой точки до _textView.SelectionStart
, т.е. гарантирует, что есть только один диапазон постоянно проверяя/удаляя/добавляя необходимый Span. Но это похоже на еще один неэффективный метод справиться с этим.
Подход 2
textView.EditableText.SetSpan(new StyleSpan(TypefaceStyle.Bold), start, end, SpanTypes.ExclusiveInclusive);
Таким образом, это не приводит к той же неэффективности, что и выше, но из-за флага SpanTypes.ExclusiveInclusive
я не могу остановить форматирование стиля до конца, когда я отключаю его через пользовательский интерфейс. Другими словами, когда я включаю полужирный стиль, весь последующий текст будет выделен жирным шрифтом, даже если я выключил этот переключатель.
Из этих двух мне кажется, что это правильный общий подход, и поэтому мне интересно, могу ли я что-нибудь сделать, чтобы остановить применение стиля, как только я выключу его переключатель. Или есть другой способ, который я вообще пропустил как наилучшую практику для обработки такого рода требований.