web-dev-qa-db-ja.com

SpannableStringBuilderからSpannableStringを取得するための最良の方法

私は、マークアップトークンのセットのスパンを作成するwikiのようなパーサーで作業しています。動作していますが、トークンイテレータ内で、SpannableStringBuilderの部分的な結果をSpannableStringに変換する必要が頻繁にあります。これはかなり頻繁に呼び出されるので、私はそれを行うための最も効率的な解決策を求めており、余分なオブジェクトを作成することは避けています。

私が使用している現在;

SpannableStringBuilder stuff=complex_routine_that_builds_it();
SpannableString result=SpannableString.valueOf(stuff);

ただし、このvalueOf呼び出しは、内部的にSpannableStringの種類をゼロから構築し、toStringとループを実行して割り当てられたspansをコピーします。

SpannableStringBuilderの名前が示すように、ビルダーからSpannableStringを取得するより速い方法があると思います。それは本当ですか?

20
rupps

SpannableStringBuilderのように直接使用できる場合は、SpannableStringTextViewに変換する必要はありません。

SpannableStringBuilder stuff = complex_routine_that_builds_it();
textView.setText(stuff);

質問がすでに示したように、絶対に必要な場合は変換を行うことができます

SpannableStringBuilder stuff = complex_routine_that_builds_it();
SpannableString result = SpannableString.valueOf(stuff);

しかし、なぜその変換を行う必要があるのか​​を検討する必要がありますか?元のSpannableStringBuilderを使用するだけです。

SpannableString vs SpannableStringBuilder

これら2つの違いは、StringStringBuilderの違いに似ています。 Stringは不変ですが、StringBuilderのテキストを変更できます。

同様に、SpannableStringのテキストは不変ですが、SpannableStringBuilderのテキストは変更可能です。ただし、これはテキストにのみ適用されることに注意してください。両方のスパン(SpannableStringでも)を変更できます。

関連

28
Suragch