Czy można ustawić wiele stylów dla różnych fragmentów tekstu w TextView?
Na przykład ustawiam tekst w następujący sposób:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
Czy można mieć inny styl dla każdego elementu tekstowego? Np. Wiersz 1 pogrubiony, słowo 1 kursywą itp.
Podręczniku programisty za Typowe zadania i jak je zrobić w Android zawiera wybieranie Podświetlanie lub Styling fragmentów tekstu :
// Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); // Set the EditText's text. vw.setText("Italic, highlighted, bold."); // If this were just a TextView, we could do: // vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE); // to force it to use Spannable storage so styles can be attached. // Or we could specify that in the XML. // Get the EditText's internal text storage Spannable str = vw.getText(); // Create our span sections, and assign a format to each. str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Ale to wykorzystuje wyraźne numery pozycji w tekście. Czy jest na to czystszy sposób?
Odpowiedzi:
W przypadku, gdy ktoś zastanawia się, jak to zrobić, oto jeden ze sposobów: (Jeszcze raz dziękuję Markowi!)
Aby uzyskać nieoficjalną listę tagów obsługiwanych przez tę metodę, zapoznaj się z tym linkiem lub pytaniem: Które znaczniki HTML są obsługiwane przez Android TextView?
źródło
formatTextWhite(string text)
że po prostu wstawia tekst w następującym formacie ciąg:"<font size="..." color="..." face="...">%s</font>"
.Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");
? Pamiętam, że kiedyś to zadziałało. Nie jestem pewien, czy nadal działa.Html.fromHtml("<font color=\"#999999\">
sekwencje ucieczki zadziałały dla mnie :) ...mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);
żaden pomysł dziękiSpróbuj
Html.fromHtml()
i oznacz swój tekst pogrubionymi i kursywnymi znacznikami HTML, np .:źródło
monthText + " " + month.getYearLabel()
. ZobaczyćStringUtils.concat()
.monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b> "+month.getYearLabel()))
jeśli nie potrzebujesz poszczególnych elementów.Nieco nie na temat, ale uznałem, że jest to zbyt przydatne, aby nie być tutaj wymienione.
Co jeśli chcielibyśmy przeczytać tekst HTML z zasobu string.xml, a tym samym ułatwić lokalizację. CDATA umożliwia to:
Z naszego kodu Java możemy teraz go wykorzystać w następujący sposób:
Nie spodziewałem się, że to zadziała. Ale tak się stało.
Mam nadzieję, że jest to przydatne dla niektórych z was!
źródło
"@string/someText"
(gdzie „someText” jest zasobem zdefiniowanym w strings.xml), po prostu otrzymuję ciąg ze wszystkimi znacznikami HTML jako „tekst”.Jeśli nie masz ochoty używać HTML, możesz po prostu utworzyć styles.xml i użyć go w następujący sposób:
źródło
$1%s is a happy $2%s
w wiązkach strun. musisz zezwolić na zmianę kolejności tokenów.Bardziej lekkie jest stosowanie
SpannableString
zamiast znaczników HTML. Pomaga mi to zobaczyć przykłady wizualne, więc oto dodatkowa odpowiedź.To jest singiel
TextView
.Dalsze badanie
Ten przykład został pierwotnie zainspirowany stąd .
źródło
Lista obsługiwanych tagów to:
(Od http://developer.android.com/guide/faq/commontasks.html#selectingtext - link do archiwum internetowego,
<resource>
literówka jest w oryginale!)Pokazuje również, że
Html.fromHtml
tak naprawdę nie jest to potrzebne w prostych przypadkach.źródło
Miałem taki sam problem. Mógłbym używać fromHtml, ale teraz jestem androidem, nie internetem, więc postanowiłem to wypróbować. Muszę to jednak zlokalizować, więc spróbowałem, używając koncepcji zamiany łańcucha. Ustawiłem styl na TextView jako główny styl, a następnie po prostu sformatowałem pozostałe wycinki.
Mam nadzieję, że to pomoże innym, którzy chcą zrobić to samo - nie wiem, dlaczego nie jest to łatwiejsze w ramach.
Moje ciągi wyglądają tak:
Oto style:
Oto mój kod, który wywołuje moją metodę formatStyles:
Metoda formatu:
źródło
Teraz
<b>
element jest przestarzały.<strong>
renderuje jako<b>
i<em>
renderuje jako<i>
.to działa dobrze dla mnie
źródło
Oto prosty sposób, aby to zrobić za pomocą HTMLBuilder
Wynik:
Trochę pogrubionego tekstu Trochę kursywa
źródło
Jeśli chcesz mieć możliwość dodania tekstu w formacie xml, możesz utworzyć własny widok rozszerzający TextView i przesłonić setText ():
Następnie możesz użyć go w następujący sposób (zastąp
PACKAGE_NAME
nazwą pakietu):źródło
Jak wspomniano, użyj
TextView.setText(Html.fromHtml(String))
I użyj tych tagów w ciągu sformatowanym w formacie HTML:
http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html
źródło
Ja też
Co powiesz na użycie pięknego znacznika z Kotlin i Anko -
źródło
Tak, możliwe jest użycie
SpannedString
. Jeśli używasz Kotlina, staje się to jeszcze łatwiejszecore-ktx
, ponieważ zapewnia on język specyficzny dla domeny (DSL) do tego:Więcej dostępnych opcji to:
W końcu możesz po prostu:
źródło
W rzeczywistości, oprócz obiektu Html, można również użyć klas typu Spannable, np. TextAppearanceSpan lub TypefaceSpan i SpannableString. Klasa HTML również korzysta z tych mechanizmów. Ale dzięki klasom typu Spannable masz więcej swobody.
źródło
Może to być tak proste, jak wykorzystanie metody String's length ():
Podziel ciąg tekstowy w pliku XML Ciągi na tyle ciągów podrzędnych (osobne ciągi z punktu widzenia Androida), ile potrzebujesz różnych stylów, więc może to być: str1, str2, str3 (jak w twoim przypadku), które połączone razem stanowią cały pojedynczy ciąg znaków, którego używasz.
A następnie po prostu zastosuj metodę „Span”, tak jak przedstawiono to w kodzie - ale zamiast jednego łańcucha połącz wszystkie podciągi, łącząc je w jeden, każdy w innym niestandardowym stylu.
Nadal używasz liczb, ale nie bezpośrednio - nie są one teraz w formie zakodowanej (jak w kodzie), ale zastępuje się je metodami o długości () (zauważ dwie gwiazdki poprzedzające i sufiksem str. length () zamiast liczby bezwzględnej w celu wyjaśnienia zmiany):
dla pierwszego rozmiaru łańcucha, a następnie str. długość () + 1, str. długość () + str2. długość () dla drugiego rozmiaru łańcucha i tak dalej ze wszystkimi podciągami, zamiast np. 0,7 lub 8,19 i tak dalej...
źródło
Używanie pomocniczej klasy Spannable jako zasobów ciągów Androida na dole strony. Możesz do tego podejść, tworząc
CharSquences
i nadając im styl.Ale w podanym przez nas przykładzie jest tylko pogrubienie, pochylenie, a nawet pokolorowanie tekstu. Musiałem owinąć kilka stylów
CharSequence
w, aby ustawić je wTextView
. Więc do tej klasy (nazwałem jąCharSequenceStyles
) właśnie dodałem tę funkcję.I w widoku dodałem to.
Mam nadzieję, że ci to pomoże!
źródło
Spanny sprawia, że SpannableString jest łatwiejszy w użyciu.
źródło
Jak powiedział Jon , jest to dla mnie najlepsze rozwiązanie i nie musisz ustawiać żadnego tekstu w czasie wykonywania, użyj tylko tej niestandardowej klasy HtmlTextView
i to wszystko, teraz umieść to tylko w swoim XML
ze swoim ciągiem HTML
źródło