Я использую элемент управления EditText, который разрешает форматирование текста (полужирный, курсив и т. Д. c.).
Чтобы применить форматирование, в обработчике событий AfterTextChanged моего TextWatcher я определяю, используется ли стиль форматирования, например, жирный, был включен через пользовательский интерфейс. Если это так, я пробовал два разных подхода, ни один из которых не является удовлетворительным по разным причинам:
Подход 1
textView.EditableText.SetSpan(new StyleSpan(TypefaceStyle.Bold), start, end, SpanTypes.ExclusiveExclusive);
Для начала значение, я пытался использовать _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>
. Итак, ясно, что я делаю что-то не так / неэффективен в этом подходе. Очевидно, что это приводит к возможному замедлению как при вводе текста, так и при получении при запуске.
Что-то, что я рассмотрел, это проверить, есть ли Span на предыдущем символе (_textView.SelectionStart - 1
), и, если да, чтобы удалить диапазон, а затем добавить диапазон, который начинается в этой точке вплоть до _textView.SelectionStart
, т.е. гарантирует, что существует только один диапазон, постоянно проверяя / удаляя / добавляя необходимый диапазон. Но это похоже на еще один неэффективный способ справиться с этим.
Подход 2
textView.EditableText.SetSpan(new StyleSpan(TypefaceStyle.Bold), start, end, SpanTypes.ExclusiveInclusive);
Таким образом, это не приводит к той же неэффективности, что и выше, а потому что из флага SpanTypes.ExclusiveInclusive
, я не могу остановить форматирование стиля, чтобы закончить, когда я отключаю его через пользовательский интерфейс. Другими словами, когда я включаю стиль Bold, весь последующий текст будет отформатирован жирным шрифтом, даже если я выключил его.
Из этих двух мне кажется, что это правильный общий подход, и поэтому мне интересно, могу ли я сделать что-нибудь, чтобы остановить применение стиля, как только я выключу его переключение. Или есть другой способ, который я совсем пропустил как лучшую практику для обработки такого рода требований.