Ich habe einige feste Saiten in mir strings.xml
, so etwas wie:
<resources>
<string name="somestring">
<B>Title</B><BR/>
Content
</string>
</resources>
und in meinem Layout habe ich eine, TextView
die ich mit der HTML-formatierten Zeichenfolge füllen möchte.
<TextView android:id="@+id/formattedtext"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/htmlstring"/>
Wenn ich das mache, ist der Inhalt von formattedtext
nur der Inhalt von somestring
HTML-Tags entfernt und somit unformatiert.
Ich weiß, dass es möglich ist, den formatierten Text programmgesteuert mit festzulegen
.setText(Html.fromHtml(somestring));
weil ich dies in anderen Teilen meines Programms verwende, in denen es wie erwartet funktioniert.
Um diese Funktion aufzurufen, benötige ich eine Activity
, aber im Moment ist mein Layout nur eine einfache mehr oder weniger statische Ansicht in einfachem XML, und ich würde es vorziehen, dies so zu belassen, um mich vor dem Aufwand zu bewahren, eine Activity
nur zum Festlegen einiger zu erstellen Text.
Übersehe ich etwas Offensichtliches? Ist das überhaupt nicht möglich? Hilfe oder Problemumgehungen sind willkommen!
Bearbeiten: Ich habe gerade einige Dinge ausprobiert und es scheint, dass die HTML-Formatierung in XML einige Einschränkungen hat:
Tags müssen in Kleinbuchstaben geschrieben werden
Einige Tags, die hier erwähnt werden, funktionieren nicht, z. B.
<br/>
(es ist möglich,\n
stattdessen zu verwenden )
quelle
Antworten:
Nur für den Fall, dass jemand dies findet, gibt es eine schönere Alternative, die nicht dokumentiert ist (ich bin nach stundenlanger Suche darüber gestolpert und habe sie schließlich in der Fehlerliste für das Android SDK selbst gefunden). Sie CAN raw HTML in strings.xml enthalten, so lange wie Sie es wickeln in
Beispiel:
Dann in Ihrem Code:
IMHO, das ist um mehrere Größenordnungen besser zu handhaben :-)
quelle
Html.fromHtml(getString(R.string.nice_html))
bisschen gemacht? :)Da die beste Antwort hier darauf hindeutet, dass etwas nicht stimmt (oder zumindest zu kompliziert ist), sollte dies meiner Meinung nach aktualisiert werden, obwohl die Frage ziemlich alt ist:
Wenn Sie String-Ressourcen in Android verwenden, müssen Sie nur
getString(...)
Java-Code aufrufen oderandroid:text="@string/..."
in Ihrem Layout-XML verwenden.Auch wenn Sie HTML-Markup in Ihren Strings verwenden möchten, müssen Sie nicht viel ändern:
Die einzigen Zeichen, die Sie in Ihren String-Ressourcen maskieren müssen, sind:
"
wird\"
'
wird\'
&
wird&
oder&
Das heißt, Sie können Ihr HTML-Markup hinzufügen, ohne die Tags zu umgehen:
Allerdings sollten Sie nur verwenden
<b>
,<i>
und<u>
wie sie in der Dokumentation aufgeführt sind.Wenn Sie Ihre HTML-Zeichenfolgen aus XML verwenden möchten, verwenden Sie sie einfach weiter.
android:text="@string/..."
Dies funktioniert einwandfrei.Der einzige Unterschied besteht darin , dass, wenn Sie Ihre HTML - Strings verwenden möchten von Java - Code , müssen Sie verwenden
getText(...)
stattgetString(...)
jetzt, da erstere den Stil und die letzteren festhält , wird es gerade weg abzustreifen.So einfach ist das. Keine CDATA, nein
Html.fromHtml(...)
.Sie werden nur brauchen,
Html.fromHtml(...)
wenn Sie haben in HTML - Markup kodieren Ihre Sonderzeichen. Verwenden Sie es mitgetString(...)
dann. Dies kann erforderlich sein, wenn Sie den String an übergeben möchtenString.format(...)
.Das ist alles beschrieben in den Dokumenten .
Bearbeiten:
Es gibt keinen Unterschied zwischen nicht
getText(...)
entkoppeltem HTML (wie ich vorgeschlagen habe) oderCDATA
Abschnitten undHtml.fromHtml(...)
.Einen Vergleich finden Sie in der folgenden Grafik:
quelle
getResources().getText(R.string.codename)
<b>
,<i>
,<u>
. Andere Tags werden nicht immer unterstützt.Entfliehen Sie Ihren HTML-Tags ...
quelle
TextView
, um HTML anzuzeigen?fromHTML()
.Html.fromHTML()
Sie müssen die speziellen Zeichen kodieren. Seltsam!Android verfügt nicht über eine Spezifikation, die den Typ der Ressourcenzeichenfolge angibt (z. B. Text / Nur-Text oder Text / HTML). Es gibt jedoch eine Problemumgehung, mit der der Entwickler dies in der XML-Datei angeben kann.
Sobald Sie diese definiert haben, können Sie sich mit HTML in XML-Dateien ausdrücken, ohne setText (Html.fromHtml (...)) erneut aufrufen zu müssen. Ich bin ziemlich überrascht, dass dieser Ansatz nicht Teil der API ist.
Diese Lösung funktioniert in dem Maße, in dem der Android Studio-Simulator den Text als gerenderten HTML-Code anzeigt.
res / values / strings.xml (die String-Ressource als HTML)
layout.xml (nur die relevanten Teile)
Deklarieren Sie den benutzerdefinierten Attribut-Namespace und fügen Sie das Attribut android_ex: isHtml hinzu. Verwenden Sie auch die Unterklasse von TextView.
res / values / attrs.xml (benutzerdefinierte Attribute für die Unterklasse definieren)
TextViewEx.java (die Unterklasse von TextView)
quelle
Neuestes Update:
Html.fromHtml(string);
// veraltet nach Android N Versionen ..Der folgende Code unterstützt Android N und höhere Versionen ...
quelle
quelle
Ich habe einen anderen Fall, in dem ich keine Chance habe, CDATA in die XML-Datei einzufügen, wenn ich die Zeichenfolge HTML von einem Server erhalte.
Folgendes bekomme ich von einem Server:
Es scheint komplizierter zu sein, aber die Lösung ist viel einfacher.
Ich hoffe es hilft!
Linh
quelle