2011-08-26 10 views
8

Sto impostando Span in una parte del testo. Span stesso funziona bene. Tuttavia, il testo è stato creato da Resources da Resources e non so start e end di parte nel testo che ho intenzione di impostare su Span.Android: come combinare Spannable.setSpan con String.format?

Ho provato a utilizzare tag HTML personalizzati in strings.xml, ma o getText o getString rimuoverli. Potrei usare qualcosa come questo getString(R.string.text, "<nb>" + arg + "</nb>"), quindi Html.fromHtml(), perché lo arg è esattamente dove voglio impostare lo Span.

Ho visto this approach che ha utilizzato il testo formattato "normal text ##span here## normal text". Analizza la stringa rimuove i tag e imposta l'intervallo.

La mia domanda è, c'è un modo migliore per eseguire l'impostazione di Span in una stringa formattata come "something %s something" o devo utilizzare uno degli approcci di cui sopra?

risposta

2

Ho risolto questo introducendo la classe TaggedArg, le istanze di questa classe si espandono a <tag>value</tag>. Poi ho creato un oggetto che è responsabile della lettura del testo che contiene tag e che sostituisce questi tag con span. Diversi campi sono registrati nel tag map-> factory.

C'è stata una piccola sorpresa. Se hai un testo come "<xx>something</xx> something", Html.fromHtml legge questo testo come "<xx>something something</xx>". Ho dovuto aggiungere i tag <html> in tutto il testo per impedirlo.

2

getText() restituirà SpannedString oggetti che contengono la formattazione definita in strings.xml. Ho creato a custom version of String.format che manterrà qualsiasi span nella stringa di formato, anche se racchiudono gli specificatori di formato (gli spazi negli argomenti SpannedString sono anche conservati). Utilizzare in questo modo:

Spanned toDisplay = SpanFormatter.format(getText(R.string.foo), bar, baz, quux); 
0

Il modo con getText() che George suppone è interessante. Ma non c'è bisogno di scrivere una lezione in più. getText() restituisce un CharSequence. Così utilizzare SpannableStringBuilder per impostare ad un TextView:

textViewCell.setText(new SpannableStringBuilder(getText(R.string.foo)); 

Nel vostro strings.xml è possibile scrivere con html-tag (non dimenticare le citazioni prima e dopo il testo):

<string name="foo">"CO<sub><small>2</small></sub>"</string> 

Questo tipo di tag ha funzionato per me sia impostandolo manualmente su una vista testo (come sopra) o assegnandola in un layout.