2013-07-09 8 views
65

Android bietet eine Vielzahl von Schnittstellen alle im Zusammenhang mit Text und Strings: Spanned, SpannedString, Spannable, SpannableString und CharSequence.Android Spanned, SpannedString, Spannable, SpannableString und CharSequence

Ich habe alle oben in verschiedenen Szenarien in der Regel nach der Verwendung von Html.fromHtml() anzuzeigen verknüpfbar Text innerhalb eines TextView verwendet, um einige Styling, um es anzuwenden.

Ich habe versucht, den Zweck/die Verwendung dieser Schnittstellen aus der offiziellen Android-Dokumentation zu verstehen und haben versagt, da es ziemlich verwirrend ist. Was ist der Zweck dieser Schnittstellen? In welchen Szenarien ist es meistens üblich, sie zu benutzen? In welchen Fällen ist es am besten, sie zu vermeiden? Gibt es offensichtliche Leistungseinbußen, die bei der Verwendung eines dieser Faktoren berücksichtigt werden müssen?

Wenn jemand eine anständige Erklärung liefern könnte, würde es sehr geschätzt werden.

Antwort

116

Was ist der Zweck dieser Schnittstellen?

diagram from yuml.me/edit/5f8da6cb CharSequence ist eine Standard-Java-Schnittstelle, eine Folge von Zeichen darstellt. String ist die am häufigsten verwendete konkrete Implementierung von CharSequence, gefolgt von StringBuilder.

Spanned ist ein CharSequence mit "Spannen", die die Formatierung angeben, die auf Teile des Textes angewendet wird, wo diese Spannen nicht geändert werden können.

Spannable ist ein Spanned, in der Fähigkeit, das Hinzufügen der Spannweiten zu ändern (hinzufügen oder Formatierungen entfernen), aber nicht den Text selbst zu ändern.

SpannedString ist eine konkrete Implementierung der Spanned Schnittstelle.

SpannableString ist eine konkrete Implementierung der Spannable Schnittstelle.

in welchen Szenarien ist es meistens üblich, sie zu verwenden?

Wenn es eine Methode ist, dass ein zurückgibt (beispielsweise auf einer getText()EditText) oder wenn es ein Verfahren, das einer als Parameter (beispielsweise auf einem setText()TextView). diagram from yuml.me/edit/35c8f39f

Ihr zitierten Fall der Verwendung von Html.fromHtml() vielleicht in herkömmlichen Android Entwicklung ist die häufigste, als TextView mit einem Spanned viel leichter ist als ein WebView ist.Es gibt jedoch auch andere Anwendungsfälle, wie zum Beispiel:

In welchen Fällen ist es am besten, sie zu vermeiden?

Sie sind einzigartig schrecklich an Kahlköpfigkeit Bekämpfung, Schneeräumung, Wärmepumpe Reparatur, so dass ein Soufflé usw.

:-)

Gibt es offensichtliche Auswirkungen auf die Leistung berücksichtigt werden, wenn einen von ihnen benutzen?

Schnittstellen haben definitionsgemäß keine "Auswirkungen auf die Leistung" - sie sind lediglich eine Beschreibung einer API.

Ich bin mir nicht bewusst, dass bei jedem bestimmten Vorgang deutlich langsamer als SpannedString ist. Jedoch kann die SpannableStringBuilder (die es ermöglicht, den Text zusätzlich zu den Abschnitten, die diesen Text formatieren, zu manipulieren) durchaus etwas langsamer als oder SpannedString für verschiedene Dinge sein. Ob die Leistungsunterschiede ausreichen, ist abhängig von der Verwendung.

+3

Da die offiziellen Dokumente still sind, Wie haben Sie diese Informationen erhalten? Manuelle Quelle, die den hardcore Weg durchstöbert? – Pacerier

+8

@Pacerier: Ich bin mir nicht sicher, auf welchen Teil dieser Antwort Sie sich beziehen. Zum Beispiel stammt die in dieser Antwort beschriebene Klassenhierarchie ganz sicher aus der Dokumentation, insbesondere den JavaDocs. Umgekehrt kommt der Mangel an Nützlichkeit dieser Dinge für die Bekämpfung von Kahlheit von persönlicher Beobachtung. – CommonsWare

+0

@CommonsWare, also bedeutet das, dass eine Zeichenkette mit Smileys dazwischen als "spannableString" und nicht als normale Zeichenkette betrachtet wird. weil ich mit 'setText (my_string)' konfrontiert bin, wenn 'my_string' smileys hat in ihm (wie das von watsapp) im Vergleich zu normalen String .. (die nur Klartext hat) freundlicherweise werfen einige Licht ... irgendwie glaubte ich, dass smilleys nichts als Text (Unicode) sind nur – eRaisedToX

13

String

A String unveränderlich ist (dh der Text kann nicht geändert werden). Es hat auch keine damit verbundenen Spannen. (Spans sind Bereiche über dem Text, die Styling-Informationen wie Farbe, Hervorhebung, Kursivschrift, Links usw. enthalten.) Sie können also eine String verwenden, wenn Ihr Text nicht geändert werden muss und kein Styling benötigt wird.

StringBuilder

A StringBuilder hat veränderbaren Text, so dass Sie es, ohne ein neues Objekt ändern können. Es hat jedoch keine Span-Informationen. Es ist nur einfacher Text. Verwenden Sie also eine StringBuilder, wenn Sie den Text ändern müssen, aber Sie stört es nicht.

SpannedString

A SpannedString hat unveränderlichen Text (wie ein String) und unveränderliche Spanneninformation. Es ist eine konkrete Implementierung der Anforderungen, die durch die Schnittstelle Spanned definiert sind. Verwenden Sie eine SpannedString, wenn Ihr Text Stil hat, aber Sie müssen weder den Text noch den Stil ändern, nachdem er erstellt wurde.

Hinweis: Es gibt nicht so etwas wie eine SpannedStringBuilder denn wenn der Text geändert dann die Spanne Informationen würden auch sehr wahrscheinlich ändern müssen.

SpannableString

A SpannableString hat unveränderlichen Text, aber die Spanne Informationen ist wandelbar.Es ist eine konkrete Implementierung der Anforderungen, die durch die Spannable Schnittstelle definiert sind. Verwenden Sie eine , wenn Ihr Text nicht geändert werden muss, aber das Styling tut.

SpannableStringBuilder

A SpannableStringBuilder hat sowohl veränderbaren Text und Informationen umfassen. Es ist eine konkrete Implementierung der Anforderungen, die unter anderem durch die Schnittstellen definiert sind. Verwenden Sie eine SpannableStringBuilder, wenn Sie den Text und seinen Stil aktualisieren müssen.

CharSequence

A CharSequence ist eine Schnittstelle, und nicht eine konkrete Klasse. Das bedeutet, dass es nur eine Liste von Regeln definiert, die für jede Klasse, die es implementiert, zu befolgen sind. Und alle oben genannten Klassen implementieren es. So können Sie eine CharSequence verwenden, wenn Sie den Typ des Objekts, das Sie für maximale Flexibilität haben, verallgemeinern möchten. Sie können es jederzeit zu einem String oder SpannableStringBuilder oder was auch immer später, wenn Sie müssen.

+0

Ich schätze die Art, wie Sie Ihre Antwort präsentiert haben, sehr einfach zu lesen und zu verstehen, danke – JamisonMan111