Android Spanned、SpannedString、Spannable、SpannableString、CharSequence


92

Androidの申し出すべてのテキストと文字列に関連した様々なインタフェース: SpannedSpannedStringSpannableSpannableStringCharSequence

上記のすべてを、いくつかのスタイルを適用するために内にリンク可能なテキストを表示するために通常使用Html.fromHtml()した後、さまざまなシナリオで使用しTextViewました。

私は、Androidの公式ドキュメントからこれらのインターフェースの目的/使用法を理解しようとしましたが、かなり混乱しているため失敗しました。これらのインターフェースの目的は何ですか?それらを使用するのが最も一般的なシナリオはどれですか?それらの使用を避けるのが最善の場合はどの場合ですか?それらのいずれかを使用するときに考慮すべき明らかなパフォーマンスへの影響はありますか?

誰かがきちんとした説明を提供できればそれは大いに感謝されます。

回答:


148

これらのインターフェースの目的は何ですか?

yuml.me/edit/5f8da6cbの図 CharSequence文字のシーケンスを表す標準Javaインターフェースです。Stringが最も一般的に使用されるの具体的な実装でありCharSequence、がそれに続きStringBuilderます。

Spanned です CharSequence「スパン」付きので、テキストの一部に適用するフォーマットを示します。これらのスパンは変更できません。

Spannableは、Spannedスパンを変更する(フォーマットを追加または削除する)機能を追加しますが、テキスト自体は変更しません

SpannedStringSpannedインターフェースの具体的な実装です。

SpannableStringSpannableインターフェースの具体的な実装です。

それらを使用するのが最も一般的なシナリオはどれですか?

方法が存在するときに戻す一方(例えば、getText()EditText)または(例えば、パラメータなどの1つを取る方法がある場合setText()TextView)。 yuml.me/edit/35c8f39fの図

使用してのあなたの引用の場合はHtml.fromHtml()と、おそらく従来のAndroidの開発で最も一般的であるTextViewとは、Spannedあるよりも重量がかなり軽いですWebView。ただし、次のような他の使用例もあります。

それらの使用を避けるのが最善の場合はどの場合ですか?

彼らは、脱毛症、除雪、ヒートポンプの修理、スフレの作成などで、非常にひどいです。

:-)

それらのいずれかを使用するときに考慮すべき明らかなパフォーマンスへの影響はありますか?

インターフェースは、定義上、「パフォーマンスへの影響」はありません-それらは単にAPIの記述です。

それが特定の操作SpannableStringよりも大幅に遅いことは知りませんSpannedString。しかしながら、SpannableStringBuilderウェルよりも少し遅くなることがあり(フォーマットテキストことがそのスパンに加えて、テキストの操作を可能にする)、SpannableStringまたはSpannedString、様々なものを。ただし、パフォーマンスの違いが十分かどうかは、使用方法によって異なります。


4
公式ドキュメントはサイレントなので、どのようにしてこれらの情報を入手しましたか?筋の通った方法でブラウジングする手動ソース?
Pacerier 2014年

11
@Pacerier:この回答のどの部分を参照しているかはわかりません。たとえば、この回答で説明されているクラス階層は、ほとんどの場合、ドキュメント、特にJavaDocsに由来しています。逆に、はげと戦うためのこれらのことの有用性の欠如は、個人的な観察に起因します。
CommonsWare 2014年

@CommonsWareは、スマイリーが間にある文字列spannableStringは通常の文字列ではなくa と見なされることを意味します.. 通常の文字列と比較して、(watsappのように)setText(my_string) いつmy_stringスマイリーが含まれているのかで大きなラグに直面しているためです。 。(プレーンテキストのみ)親切に光を投げてください...どういうわけか私はスマイリーはテキスト(ユニコード)にすぎないと信じていました
eRaisedToX

1
@eRaisedToX:スマイリーは絵文字または画像として実装できます。AFAIK、絵文字は個々のUnicode文字であり、通常の文字列である可能性があります。画像にはImageSpan、次に必要となるものが必要SpannableStringです。
CommonsWare

おそらく確かなのですが...絵文字を扱い、通常の文字列を使用してみてください。そうすれば、ハゲに立ち向かうことができます。絵文字の実装に関しては、EditablesとSpannableStringBuildersが最適です。私はそうはいましたが、それらは単にunicodeであることがわかりましたが、絵文字スパンの識別と、パフォーマンスコストがかかる絵文字スパンの設定をコード化する方法です。わからない場合は、他の人の絵文字ライブラリを使用するように注意してくださいそれらがどのように機能するか
JamisonMan111 2018年

43

ストリング

A Stringは不変です(つまり、テキストは変更できません)。また、関連付けられているスパンもありません。(スパンは、色、強調表示、イタリック、リンクなどのスタイル情報を含むテキスト上の範囲です。)したがってString、テキストを変更する必要がなく、スタイルを必要としない場合に、aを使用できます。

StringBuilder

StringBuilderは変更可能なテキストがあるため、新しいオブジェクトを作成せずにテキストを変更できます。ただし、スパン情報はありません。単なるプレーンテキストです。したがってStringBuilder、テキストを変更する必要があるが、スタイルを設定する必要がない場合は、aを使用します。

SpannedString

SpannedStringは、不変のテキスト(などString)と不変のスパン情報があります。これは、Spannedインターフェースによって定義された要件の具体的な実装です。SpannedStringテキストにスタイルがあるが、作成後にテキストまたはスタイルを変更する必要がない場合は、aを使用します。

注:SpannedStringBuilderテキストが変更された場合、スパン情報も変更される可能性が非常に高いため、のようなものはありません。

SpannableString

AにSpannableStringは不変のテキストがありますが、そのスパン情報は変更可能です。これは、Spannableインターフェースによって定義された要件の具体的な実装です。SpannableStringテキストを変更する必要はないがスタイルは変更する場合は、aを使用します。

SpannableStringBuilder

AにSpannableStringBuilderは、変更可能なテキストとスパン情報の両方があります。それはによって定義された要件の具体的な実装ですSpannableEditable(および)インターフェース。SpannableStringBuilderテキストとそのスタイルを更新する必要がある場合は、aを使用します。

CharSequence

A CharSequenceはインターフェースであり、具象クラスではありません。つまり、それを実装するクラスが従うべきルールのリストを定義するだけです。上記のすべてのクラスがそれを実装しています。したがってCharSequence、最大限の柔軟性を得るために、オブジェクトのタイプを一般化したい場合にaを使用できます。必要に応じて、いつでも、StringまたはSpannableStringBuilder後で何かにダウンキャストできます。


3
非常に読みやすく、理解しやすい回答の提示方法に感謝します。ありがとう
JamisonMan111 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.