Android Spanned, SpannedString, Spannable, SpannableString e CharSequence


92

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

Ho usato tutto quanto sopra in vari scenari di solito dopo averlo utilizzato Html.fromHtml()per visualizzare il testo collegabile all'interno di TextViewa per applicare uno stile ad esso.

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

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

Risposte:


148

Qual è lo scopo di queste interfacce?

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

Spannedè un CharSequencecon "intervalli" che indica la formattazione da applicare a parti del testo, dove quegli intervalli non possono essere modificati.

Spannableè un Spanned, che aggiunge la possibilità di modificare gli intervalli (per aggiungere o rimuovere la formattazione), ma non per modificare il testo stesso.

SpannedStringè un'implementazione concreta Spanneddell'interfaccia.

SpannableStringè un'implementazione concreta Spannabledell'interfaccia.

in quali scenari è più comune usarli?

Quando c'è un metodo che ne restituisce uno (ad esempio, getText()su un EditText) o quando c'è un metodo che ne prende uno come parametro (ad esempio, setText()su a TextView). diagramma da yuml.me/edit/35c8f39f

Il tuo caso di utilizzo citato Html.fromHtml()è forse il più comune nello sviluppo Android convenzionale, poiché un TextViewcon a Spannedè molto più leggero di un WebView. Tuttavia, ci sono altri casi d'uso, come:

In quali casi è meglio evitare di utilizzarli?

Sono straordinariamente terribili nel combattere la calvizie, la rimozione della neve, la riparazione della pompa di calore, la preparazione di un soufflé, ecc.

:-)

Ci sono evidenti impatti sulle prestazioni da considerare quando si utilizza uno di essi?

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

Non sono a conoscenza che SpannableStringsia significativamente più lento rispetto SpannedStringa qualsiasi operazione particolare. Tuttavia, SpannableStringBuilder(che consente di manipolare il testo oltre alle estensioni che formattano quel testo) potrebbe essere un po 'più lento di SpannableStringo SpannedStringper varie cose. Tuttavia, se le differenze di prestazioni sono sufficienti o meno importanti dipenderà dall'utilizzo.


4
Dato che i documenti ufficiali tacciono, come hai ottenuto queste informazioni? Fonte manuale che esplora in modo hardcore?
Pacerier

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

@CommonsWare, quindi significa che una stringa con emoticon in mezzo sarebbe considerata una spannableStringe non normale .. perché sto affrontando un enorme ritardo con setText(my_string) quando my_stringha le faccine (come quella di watsapp) rispetto alla normale stringa. . (che ha solo testo semplice) gentilmente getta un po 'di luce ... in qualche modo ho creduto che le faccine non fossero altro che solo testo (unicode)
eRaisedToX

1
@eRaisedToX: le faccine possono essere implementate come emoji o immagini. Per quanto ne so, le emoji sarebbero singoli caratteri Unicode e presumibilmente potrebbero essere in una stringa normale. Le immagini richiederebbero ciò ImageSpanche a sua volta richiede SpannableString.
CommonsWare

Presumibilmente sicuro ... ma prova a gestire gli emoji e ad usare le corde normali e tornerai subito a combattere la calvizie. Modificabili e SpannableStringBuilders sono i tuoi migliori amici quando si tratta di implementare emoji. Ho scoperto che anche se sì, sono semplicemente unicode, è il modo in cui codifichi l'identificazione dell'estensione emoji e l'impostazione dell'estensione emoji che è dove entra in gioco il tuo costo delle prestazioni. Fai attenzione usando le librerie emoji di altre persone se non lo sai come funzionano ...
JamisonMan111

43

Corda

A Stringè immutabile (cioè, il testo non può cambiare). Inoltre non ha intervalli ad esso associati. (Gli intervalli sono intervalli sul testo che includono informazioni sullo stile come colore, evidenziazione, corsivo, collegamenti, ecc.) Quindi puoi usare un Stringquando il tuo testo non ha bisogno di essere modificato e non necessita di alcuno stile.

StringBuilder

A StringBuilderha un testo modificabile, quindi puoi modificarlo senza creare un nuovo oggetto. Tuttavia, non ha alcuna informazione sull'intervallo. È solo testo semplice. Quindi usa a StringBuilderquando hai bisogno di cambiare il testo, ma non ti interessa modellarlo.

SpannedString

A SpannedStringha testo immutabile (come a String) e informazioni span immutabili. È un'implementazione concreta dei requisiti definiti Spanneddall'interfaccia. Usa un SpannedStringquando il tuo testo ha uno stile ma non è necessario modificare né il testo né lo stile dopo che è stato creato.

Nota: non esiste una cosa come a SpannedStringBuilderperché se il testo cambia, molto probabilmente anche le informazioni sull'intervallo dovrebbero cambiare.

SpannableString

A SpannableStringha testo immutabile, ma le sue informazioni sull'intervallo sono mutabili. È un'implementazione concreta dei requisiti definiti Spannabledall'interfaccia. Usa a SpannableStringquando il tuo testo non ha bisogno di essere cambiato ma lo stile sì.

SpannableStringBuilder

A SpannableStringBuilderha sia testo modificabile che informazioni sull'intervallo. È un'implementazione concreta dei requisiti definiti dalle interfacce Spannablee Editable(tra gli altri). Usa un SpannableStringBuilderquando dovrai aggiornare il testo e il suo stile.

CharSequence

A CharSequenceè un'interfaccia e non una classe concreta. Ciò significa che definisce solo un elenco di regole da seguire per ogni classe che lo implementa. E tutte le classi sopra menzionate lo implementano. Quindi puoi usare a CharSequencequando vuoi generalizzare il tipo di oggetto che hai per la massima flessibilità. Puoi sempre abbassarlo a Stringo SpannableStringBuildero qualsiasi altra cosa in seguito, se necessario.


3
Apprezzo il modo in cui hai presentato la tua risposta, molto facile da leggere e da capire, grazie
JamisonMan111
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.