2013-07-09 8 views
65

Android offre una varietà di interfacce tutti legati al testo e le stringhe: Spanned, SpannedString, Spannable, SpannableString e CharSequence.spanning Android, SpannedString, Spannable, SpannableString e CharSequence

ho usato tutto quanto sopra in vari scenari solitamente dopo usando Html.fromHtml() per visualizzare il testo reticolabile all'interno di una TextView per applicare alcuni styling ad esso.

Ho cercato di capire lo scopo/l'utilizzo di queste interfacce dalla documentazione ufficiale di Android e ho fallito in quanto è piuttosto confuso .. Qual è lo scopo di queste interfacce? in quali scenari è più comune usarli? In quali casi è meglio evitare di usarli? Ci sono impatti evidenti sulle prestazioni da prendere in considerazione quando si utilizza uno di essi?

Se qualcuno potesse fornire una spiegazione decente, sarebbe molto apprezzato.

risposta

116

Qual è lo scopo di queste interfacce?

diagram from yuml.me/edit/5f8da6cb CharSequence è un'interfaccia standard di Java che rappresenta una sequenza di caratteri. String è l'attuazione concreta più comunemente usata di CharSequence, seguito da StringBuilder.

Spanned è un CharSequence con "span" che indica la formattazione da applicare a porzioni di testo, in cui tali span non possono essere modificati.

Spannable è un Spanned, aggiungendo nella capacità di modificare le campate (per aggiungere o rimuovere formattazione), ma non modificare il testo stesso.

SpannedString è un'implementazione concreta dell'interfaccia Spanned.

SpannableString è un'implementazione concreta dell'interfaccia Spannable.

in quali scenari è più comune usarli?

Quando v'è un metodo che restituisce uno (per esempio, su un getText()EditText) o quando v'è un metodo che prende uno come parametro (per esempio, su un setText()TextView). diagram from yuml.me/edit/35c8f39f

tuo caso citato di utilizzare Html.fromHtml() è forse il più comune nello sviluppo di Android convenzionale, come TextView con un Spanned è molto più leggero nel peso che è un WebView.Tuttavia, ci sono altri casi d'uso, come ad esempio:

In quali casi è meglio evitare di usarli?

Sono singolarmente terribile a combattere la calvizie, la rimozione della neve, la riparazione della pompa di calore, facendo un soufflé, ecc

:-)

Ci sono dell'impatto sul rendimento evidenti da considerare quando usando qualcuno di loro?

Le interfacce, per definizione, non hanno "impatti sulle prestazioni" - sono semplicemente una descrizione di un'API.

Non sono a conoscenza del fatto che lo SpannableString è notevolmente più lento di SpannedString in qualsiasi operazione particolare. Tuttavia, SpannableStringBuilder (che consente di manipolare il testo in aggiunta agli span che formattano quel testo) potrebbe essere un po 'più lento di SpannableString o SpannedString per varie cose. Tuttavia, le differenze di prestazioni sono sufficienti per dipendere dall'uso.

+3

Dato che i documenti ufficiali sono silenziosi, come hai ottenuto queste informazioni? Fonte manuale che esplora in modo hardcore? – Pacerier

+8

@Pacerier: non sono sicuro di quale parte di questa risposta ti riferisci. Ad esempio, la gerarchia di classi descritta in questa risposta proviene in gran parte dalla documentazione, in particolare da JavaDocs. Viceversa, la mancanza di utilità di queste cose per combattere la calvizie deriva dall'osservazione personale. – CommonsWare

+0

@CommonsWare, quindi vuol dire che una stringa con emoticon intermedie sarebbe considerata una spannevoleStringa e non una normale. perché sto affrontando un enorme ritardo con 'setText (my_string)' quando 'my_string' ha emoticon in esso (come quello di watsapp) rispetto alla stringa normale .. (che ha solo testo normale) gentilmente getta un po 'di luce ... in qualche modo ho creduto che gli smille non siano altro che testo (unicode) solo – eRaisedToX

13

String

Un String è immutabile (vale a dire, il testo non può cambiare). Inoltre non ha span associati ad esso. (Gli intervalli spaziano sul testo che includono informazioni sullo stile come colore, evidenziazione, corsivo, collegamenti, ecc.) Quindi puoi usare un String quando il testo non ha bisogno di essere cambiato e non ha bisogno di alcuno stile.

StringBuilder

Un StringBuilder ha il testo mutevole, in modo da poter modificare senza creare un nuovo oggetto. Tuttavia, non ha informazioni span. È semplicemente testo. Quindi usa un StringBuilder quando hai bisogno di cambiare il testo, ma non ti preoccupi di farlo.

SpannedString

Un SpannedString ha testo immutabile (come un String) e le informazioni arco immutabile. È un'implementazione concreta dei requisiti definiti dall'interfaccia Spanned. Utilizzare uno SpannedString quando il testo ha stile ma non è necessario modificare il testo o lo stile dopo che è stato creato.

Nota: Non esiste una cosa come SpannedStringBuilder perché se il testo cambia, anche le informazioni di span dovrebbero cambiare molto probabilmente.

SpannableString

Un SpannableString ha il testo immutabile, ma le sue informazioni arco è mutevole.È un'implementazione concreta dei requisiti definiti dall'interfaccia Spannable. Utilizzare un SpannableString quando il testo non deve essere modificato ma lo stile lo fa.

SpannableStringBuilder

Un SpannableStringBuilder ha sia il testo mutevole e estendersi informazioni. Si tratta di un'applicazione concreta dei requisiti definiti dalle interfacce Spannable e Editable (tra le altre). Utilizzare un SpannableStringBuilder quando è necessario aggiornare il testo e il suo stile.

CharSequence

Un CharSequence è un'interfaccia e non una classe concreta. Ciò significa che definisce semplicemente un elenco di regole da seguire per qualsiasi classe che lo implementa. E tutte le classi menzionate sopra lo implementano. Quindi puoi usare un CharSequence quando vuoi generalizzare il tipo di oggetto che hai per la massima flessibilità. Puoi sempre sottoporlo a downcast a String o SpannableStringBuilder o qualsiasi altra ora successiva se necessario.

+0

Apprezzo il modo in cui hai presentato la tua risposta, molto facile da leggere e capire, grazie – JamisonMan111

Problemi correlati