Was ist der Zweck dieser Schnittstellen?
CharSequence
ist eine Standard-Java-Schnittstelle, die eine Folge von Zeichen darstellt. String
ist die am häufigsten verwendete konkrete Implementierung von CharSequence
, gefolgt von StringBuilder
.
Spanned
ist ein CharSequence
mit "Bereiche", der die Formatierung angibt, die auf Teile des Textes angewendet werden soll, in denen diese Bereiche nicht geändert werden können.
Spannable
ist eine Spanned
, die die Möglichkeit hinzufügt, die Bereiche zu ändern (Formatierung hinzuzufügen oder zu entfernen), aber den Text selbst nicht zu ändern.
SpannedString
ist eine konkrete Implementierung der Spanned
Schnittstelle.
SpannableString
ist eine konkrete Implementierung der Spannable
Schnittstelle.
In welchen Szenarien werden sie meistens verwendet?
Wenn es eine Methode gibt, die eine zurückgibt (z. B. getText()
bei einer EditText
), oder wenn es eine Methode gibt, die eine als Parameter verwendet (z. B. setText()
bei a TextView
).
Ihr zitierter Fall der Verwendung Html.fromHtml()
ist vielleicht der häufigste in der konventionellen Android-Entwicklung, da ein TextView
mit a Spanned
viel leichter ist als ein WebView
. Es gibt jedoch auch andere Anwendungsfälle wie:
In welchen Fällen ist es am besten, sie nicht zu verwenden?
Sie sind besonders schrecklich bei der Bekämpfung von Kahlheit, Schneeräumung, Reparatur von Wärmepumpen, Herstellung eines Soufflés usw.
:-)
Gibt es offensichtliche Auswirkungen auf die Leistung, die bei der Verwendung einer dieser Faktoren zu berücksichtigen sind?
Schnittstellen haben per Definition keine "Auswirkungen auf die Leistung" - sie sind lediglich eine Beschreibung einer API.
Mir ist nicht bewusst, dass dies SpannableString
wesentlich langsamer ist als SpannedString
bei einer bestimmten Operation. Allerdings SpannableStringBuilder
(was das Bearbeiten des Textes zusätzlich zu den Bereichen ermöglicht, in denen dieser Text formatiert wird) kann jedoch etwas langsamer sein als SpannableString
oder SpannedString
für verschiedene Dinge. Ob die Leistungsunterschiede ausreichen, hängt jedoch von der Verwendung ab.
spannableString
und keine normale angesehen wird. Ich habe eine große Verzögerung,setText(my_string)
wennmy_string
Smileys (wie die von WatsApp) im Vergleich zu normalen Zeichenfolgen enthalten sind. . (der nur einfachen Text enthält) werfen Sie bitte etwas Licht ... irgendwie glaubte ich, dass Smilleys nichts als Text (Unicode) sindImageSpan
was wiederum erfordertSpannableString
.String
A
String
ist unveränderlich (dh der Text kann sich nicht ändern). Es sind auch keine Bereiche zugeordnet. (Bereiche sind Bereiche über dem Text, die Stilinformationen wie Farbe, Hervorhebung, Kursivschrift, Links usw. enthalten.) Sie können also a verwenden,String
wenn Ihr Text nicht geändert werden muss und kein Stil benötigt.StringBuilder
A
StringBuilder
hat veränderlichen Text, sodass Sie ihn ändern können, ohne ein neues Objekt zu erstellen. Es enthält jedoch keine Bereichsinformationen. Es ist nur einfacher Text. Verwenden Sie also a,StringBuilder
wenn Sie den Text ändern müssen, sich aber nicht um das Styling kümmern.SpannedString
A
SpannedString
hat unveränderlichen Text (wie aString
) und unveränderliche Bereichsinformationen. Es ist eine konkrete Umsetzung der von derSpanned
Schnittstelle definierten Anforderungen . Verwenden Sie a,SpannedString
wenn Ihr Text einen Stil hat, Sie jedoch weder den Text noch den Stil nach der Erstellung ändern müssen.Hinweis: Es gibt keine,
SpannedStringBuilder
denn wenn sich der Text ändern würde, müssten sich höchstwahrscheinlich auch die Bereichsinformationen ändern.SpannableString
A
SpannableString
hat unveränderlichen Text, aber seine Bereichsinformationen sind veränderbar. Es ist eine konkrete Umsetzung der von derSpannable
Schnittstelle definierten Anforderungen . Verwenden Sie a,SpannableString
wenn Ihr Text nicht geändert werden muss, das Styling jedoch.SpannableStringBuilder
A
SpannableStringBuilder
enthält sowohl veränderbare Text- als auch Bereichsinformationen. Es handelt sich um eine konkrete Umsetzung der Anforderungen, die unter anderem durch die SchnittstellenSpannable
und definiert werdenEditable
. Verwenden Sie a,SpannableStringBuilder
wenn Sie den Text und seinen Stil aktualisieren müssen.Zeichenfolge
A
CharSequence
ist eine Schnittstelle und keine konkrete Klasse. Das heißt, es wird nur eine Liste von Regeln definiert, die für jede Klasse befolgt werden müssen, die sie implementiert. Und alle oben genannten Klassen implementieren es. Sie können also a verwenden,CharSequence
wenn Sie den Objekttyp, den Sie haben, für maximale Flexibilität verallgemeinern möchten. Sie können es später jederzeit auf einString
oderSpannableStringBuilder
oder was auch immer zurückwerfen, wenn Sie müssen.quelle