テキストの書式設定 (太字、斜体など) を許可する EditText コントロールを使用しています。
書式設定を適用するには、TextWatcher の AfterTextChanged イベント ハンドラー内で、UI を介して太字などの書式設定スタイルがオンになっているかどうかを検出します。もしそうなら、私は2つの異なるアプローチを試しましたが、どちらも異なる理由で満足のいくものではありません:
アプローチ1
textView.EditableText.SetSpan(new StyleSpan(TypefaceStyle.Bold), start, end, SpanTypes.ExclusiveExclusive);
開始値については、_textView.SelectionStart - 1または StyleSpan が最初に適用されたときの開始位置を使用してみました。そして、終了値_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
つまり、常に単一のスパンしかないことを保証します必要なスパンをチェック/削除/追加します。しかし、これはこれを処理する別の非効率的な方法のようです。
アプローチ 2
textView.EditableText.SetSpan(new StyleSpan(TypefaceStyle.Bold), start, end, SpanTypes.ExclusiveInclusive);
したがって、これは上記と同じ非効率にはつながりませんが、SpanTypes.ExclusiveInclusive
フラグが原因で、UI を介してオフに切り替えたときに、スタイルの書式設定を停止して終了することができません。つまり、Bold スタイルをオンにすると、トグルをオフにした場合でも、それに続くすべてのテキストが太字スタイルで書式設定されます。
2つのうち、これは正しい一般的なアプローチであると思われるので、トグルをオフにするとすぐにスタイルの適用を停止するために何かできるかどうか疑問に思っています. または、この種の要件を処理するためのベスト プラクティスとして完全に見逃した別の方法があります。