2011-08-26 18 views
8

Ustawiam Span na część tekstu. Span sam działa dobrze. Jednak tekst jest tworzony przez String.format z Resources i nie wiem, start i części w tekście, na który ustawię Span.Android: jak połączyć Spannable.setSpan z String.format?

Próbowałem użyć niestandardowych znaczników HTML w strings.xml, ale albo getText lub getString je usunąć. Mogę użyć czegoś takiego: getString(R.string.text, "<nb>" + arg + "</nb>"), następnie Html.fromHtml(), ponieważ arg jest dokładnie tam, gdzie chcę ustawić Span.

Widziałem this approach używany tekst sformatowany "normal text ##span here## normal text". Parsuje ciąg usuwa znaczniki i ustawia zakres.

Moje pytanie brzmi, czy istnieje lepszy sposób na ustawienie ustawienia zakresu na formowany ciąg znaków, taki jak "something %s something", czy powinienem zastosować jedno z powyższych podejść?

Odpowiedz

2

Rozwiązałem to, wprowadzając klasę TaggedArg, wystąpienia tej klasy rozszerzają się do <tag>value</tag>. Następnie stworzyłem obiekt, który jest odpowiedzialny za czytanie tekstu zawierającego znaczniki i zastępowanie tych znaczników przez przęsła. Różne rozpiętości są rejestrowane w tagu mapy-> fabrycznie.

Jedna niespodzianka. Jeśli tekst taki jak "<xx>something</xx> something", Html.fromHtml czyta ten tekst jako "<xx>something something</xx>". Musiałem dodać tagi <html> wokół całego tekstu, aby temu zapobiec.

2

getText() zwróci SpannedString obiektów zawierających formatowanie zdefiniowane w pliku strings.xml. Stworzyłem a custom version of String.format, który zachowa wszelkie rozpiętości w łańcuchu formatowania, nawet jeśli zawierają one specyfikatory formatu (rozstępy w argumentach SpannedString również są zachowywane). Użyj go tak:

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

Droga przez getText(), która według George'a jest interesująca. Ale nie ma potrzeby pisania dodatkowej klasy. getText() zwraca wartość CharSequence. Więc używać SpannableStringBuilder ustawić to do TextView:

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

W swojej strings.xml można napisać go z tagów HTML (nie zapomnij notowań przed i po tekście):

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

Ten rodzaj tagowania zadziałał dla mnie albo ustawiając go ręcznie na textView (jak wyżej), albo przypisując go w układzie.