Mam kilka stałych ciągów w sobie strings.xml
, coś w stylu:
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
a w moim układzie mam taki, TextView
który chciałbym wypełnić ciągiem sformatowanym w formacie HTML.
<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>
jeśli to zrobię, zawartość formattedtext
jest po prostu somestring
pozbawiona tagów HTML i dlatego jest niesformatowana.
Wiem, że możliwe jest programowe ustawienie sformatowanego tekstu
.setText(Html.fromHtml(somestring));
ponieważ używam tego w innych częściach mojego programu, gdzie działa zgodnie z oczekiwaniami.
Aby wywołać tę funkcję muszę mieć Activity
, ale w tej chwili mój układ jest tylko prosty bardziej lub mniej statyczny widok w prostym formacie XML i wolałbym zostawić to w ten sposób, aby zapisać mnie od napowietrznej stworzenie Activity
po prostu ustawić niektóre tekst.
Czy przeoczam coś oczywistego? Czy to w ogóle nie jest możliwe? Każda pomoc lub obejścia są mile widziane!
Edycja: Właśnie wypróbowałem kilka rzeczy i wydaje się, że formatowanie HTML w xml ma pewne ograniczenia:
tagi muszą być zapisane małymi literami
niektóre wymienione tu tagi nie działają, np.
<br/>
(można\n
zamiast tego użyć )
źródło
Odpowiedzi:
Na wypadek, gdyby ktoś to znalazł, istnieje fajniejsza alternatywa, która nie została udokumentowana (potknąłem się o nią po wielu godzinach, aż w końcu znalazłem ją na liście błędów dla samego zestawu SDK systemu Android). Ci MOŻE zawierać surowego HTML w strings.xml, tak długo, jak owinąć go w
Przykład:
Następnie w kodzie:
IMHO, jest o kilka rzędów wielkości ładniejsza do pracy :-)
źródło
Html.fromHtml(getString(R.string.nice_html))
trochę? :)Ponieważ najważniejsza odpowiedź tutaj sugeruje coś złego (lub przynajmniej zbyt skomplikowanego), uważam, że należy to zaktualizować, chociaż pytanie jest dość stare:
Korzystając z zasobów String w Androidzie, wystarczy zadzwonić
getString(...)
z kodu Java lub użyćandroid:text="@string/..."
w układzie XML.Nawet jeśli chcesz używać znaczników HTML w swoich ciągach, nie musisz dużo zmieniać:
Jedynymi postaciami, które musisz uciec w zasobach String, są:
"
staje się\"
'
staje się\'
&
staje się&
lub&
Oznacza to, że możesz dodać znaczniki HTML bez uciekania się od tagów:
Jednak, aby mieć pewność, należy użyć tylko
<b>
,<i>
i<u>
jak są one wymienione w dokumentacji.Jeśli chcesz używać ciągów HTML z XML , po prostu używaj dalej
android:text="@string/..."
, będzie działać dobrze.Jedyna różnica polega na tym, że jeśli chcesz używać ciągów HTML z kodu Java , musisz użyć
getText(...)
zamiast tegogetString(...)
, ponieważ ten pierwszy zachowuje styl, a drugi po prostu go rozebra.To takie proste. Bez CDATA, nie
Html.fromHtml(...)
.Konieczne będzie tylko
Html.fromHtml(...)
jeśli nie zakodowanie znaków specjalnych znaczników HTML. Użyj gogetString(...)
wtedy. Może to być konieczne, jeśli chcesz przekazać ciągString.format(...)
.Wszystko to opisano również w dokumentach .
Edytować:
Nie ma różnicy między
getText(...)
nieskalowanym HTML (jak zaproponowałem) lubCDATA
sekcjami iHtml.fromHtml(...)
.Dla porównania zobacz następującą grafikę:
źródło
getResources().getText(R.string.codename)
<b>
,<i>
,<u>
. Inne tagi nie zawsze są obsługiwane.Unikaj tagów HTML ...
źródło
TextView
aby wyświetlić HTML?fromHTML()
.Html.fromHTML()
, musisz zakodować znaki specjalne. Dziwne!Android nie ma specyfikacji wskazującej typ ciągu zasobów (np. Tekst / zwykły lub tekst / HTML). Istnieje jednak obejście, które pozwoli programiście określić to w pliku XML.
Po ich zdefiniowaniu możesz wyrazić siebie za pomocą HTML w plikach xml bez konieczności ponownego wywoływania setText (Html.fromHtml (...)). Jestem raczej zaskoczony, że takie podejście nie jest częścią API.
To rozwiązanie działa w takim stopniu, że symulator studia Androida wyświetli tekst jako renderowany HTML.
res / wartości / strings.xml (zasób łańcucha jako HTML)
layout.xml (tylko odpowiednie części)
Zadeklaruj przestrzeń nazw niestandardowych atrybutów i dodaj atrybut android_ex: isHtml. Użyj także podklasy TextView.
res / wartości / attrs.xml (zdefiniuj niestandardowe atrybuty dla podklasy)
TextViewEx.java (podklasa TextView)
źródło
Najnowsza aktualizacja:
Html.fromHtml(string);
// przestarzałe po wersjach Androida N.Poniższy kod obsługuje Androida N i nowsze wersje ...
źródło
źródło
Mam inny przypadek, gdy nie mam szansy na umieszczenie CDATA w xml, gdy otrzymuję ciąg HTML z serwera.
Oto, co otrzymuję z serwera:
Wydaje się to bardziej skomplikowane, ale rozwiązanie jest znacznie prostsze.
Mam nadzieję, że to pomoże!
Linh
źródło