Ich habe einfacheHTML:
<h2>Title</h2><br>
<p>description here</p>
Ich möchte HTML-Text in TextView
anzeigen. Wie macht man das?
Sie müssen Html.fromHtml()
verwenden, um HTML in Ihren XML-Strings zu verwenden. Das einfache Verweisen auf einen String mit HTML in Ihrem XML-Layout funktioniert nicht.
Das sollten Sie tun:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
} else {
textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
}
setText (Html.fromHtml (bodyData)) ist veraltet nach api 24. Jetzt müssen Sie Folgendes tun:
if (Android.os.Build.VERSION.SDK_INT >= Android.os.Build.VERSION_CODES.N) {
tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
} else {
tvDocument.setText(Html.fromHtml(bodyData));
}
Schauen Sie sich dies an: https://stackoverflow.com/a/8558249/450148
Es ist auch ziemlich gut !!
<resource>
<string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>
Es funktioniert nur für wenige Tags.
Wenn Sie es ohne XML-Code-Änderung über XML konfigurieren möchten, ist diese Idee möglicherweise hilfreich. Sie rufen einfach init vom Konstruktor auf und setzen den Text als HTML
public class HTMLTextView extends TextView {
... constructors calling init...
private void init(){
setText(Html.fromHtml(getText().toString()));
}
}
xml:
<com.package.HTMLTextView
Android:text="@string/about_item_1"/>
Der folgende Code ergab das beste Ergebnis für mich.
TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
Wenn Sie versuchen, HTML aus einer String-Ressourcen-ID anzuzeigen, wird die Formatierung möglicherweise nicht auf dem Bildschirm angezeigt. Wenn dies bei Ihnen der Fall ist, verwenden Sie stattdessen CDATA-Tags:
strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>
...
MainActivity.Java:
text.setText(Html.fromHtml(getString(R.string.sample_string));
Weitere Informationen finden Sie in diesem post .
Wenn Sie nur etwas HTML-Text anzeigen möchten und keine TextView
wirklich benötigen, nehmen Sie eine WebView
und verwenden Sie sie wie folgt:
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
Dies beschränkt Sie auch nicht auf einige HTML-Tags.
String value = "<html> <a href=\"http://example.com/\">example.com</a> </html>";
SiteLink= (TextView) findViewById(R.id.textViewSite);
SiteLink.setText(Html.fromHtml(value));
SiteLink.setMovementMethod(LinkMovementMethod.getInstance());
Die beste Methode, CData-Abschnitte für die Zeichenfolge in der Datei strings.xml zu verwenden, um eine tatsächliche Anzeige des HTML-Inhalts in der Textansicht zu erhalten. Das folgende Code-Snippet vermittelt Ihnen eine gute Idee.
//in string.xml file
<string name="welcome_text"><![CDATA[<b>Welcome,</b> to the forthetyroprogrammers blog Logged in as:]]> %1$s.</string>
//and in Java code
String welcomStr=String.format(getString(R.string.welcome_text),username);
tvWelcomeUser.setText(Html.fromHtml(welcomStr));
Der CData-Abschnitt in String-Text hält die HTML-Tag-Daten auch nach der Formatierung von Text mithilfe der String.format-Methode aufrecht. Html.fromHtml (str) funktioniert also einwandfrei und in der Begrüßungsnachricht wird der fette Text angezeigt.
Ausgabe:
Willkommen in Ihrem Lieblings-App-Store für Musik. Angemeldet als: Benutzername
Es ist erwähnenswert, dass die Methode Html.fromHtml (String source) ab API Level 24 nicht mehr verwendet wird. Wenn dies Ihre Ziel-API ist, sollten Sie stattdessen Html.fromHtml (String source, int flags) verwenden.
Ich möchte auch folgendes Projekt vorschlagen: https://github.com/NightWhistler/HtmlSpanner
Die Nutzung ist fast identisch mit dem Standard-Android-Konverter:
(new HtmlSpanner()).fromHtml()
Fand es, nachdem ich bereits mit der eigenen Implementierung von html zu spannbarem Konverter begonnen hatte, da Standard-Html.fromHtml keine ausreichende Flexibilität bei der Rendering-Kontrolle bietet und auch keine Möglichkeit zur Verwendung benutzerdefinierter Schriftarten von ttf
Einfache Verwendung Html.fromHtml("html string")
. Das wird funktionieren. Wenn der String Tags wie <h1>
enthält, werden Leerzeichen eingefügt. Aber wir können diese Räume nicht beseitigen. Wenn Sie die Leerzeichen trotzdem entfernen möchten, können Sie die Tags in der Zeichenfolge entfernen und die Zeichenfolge an die Methode Html.fromHtml("html string");
übergeben. Im Allgemeinen stammen diese Zeichenfolgen vom Server (dynamisch), aber nicht oft, wenn es besser ist, die Zeichenfolge wie sie ist an die Methode zu übergeben, als die Tags aus der Zeichenfolge zu entfernen.
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
Machen Sie eine globale Methode wie:
public static Spanned stripHtml(String html) {
if (!TextUtils.isEmpty(html)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT);
} else {
return Html.fromHtml(html);
}
}
return null;
}
Sie können es auch in Ihrer Aktivität/Fragment verwenden:
text_view.setText(stripHtml(htmlText));
Ich habe dies über die Webansicht implementiert. In meinem Fall muss ich ein Bild von der URL zusammen mit dem Text in der Textansicht laden, und das funktioniert für mich.
WebView myWebView =new WebView(_context);
String html = childText;
String mime = "text/html";
String encoding = "utf-8";
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);
Es wurde durch verschiedene Antworten vorgeschlagen, die Html - Framework-Klasse wie hier vorgeschlagen zu verwenden, aber leider hat diese Klasse in verschiedenen Versionen von Android und verschiedenen nicht adressierten Fehlern ein unterschiedliches Verhalten, wie in Ausgaben 214637 , gezeigt. 14778 , 235128 und 75953 .
Daher möchten Sie möglicherweise eine Kompatibilitätsbibliothek verwenden, um die Html-Klasse für Android-Versionen zu standardisieren und zurückzuschicken, die weitere Rückrufe für Elemente und Stil enthält:
Obwohl es der Html-Klasse des Frameworks ähnelt, waren einige Signaturänderungen erforderlich, um weitere Rückrufe zuzulassen. Hier ist das Beispiel von der GitHub-Seite:
Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0);
// You may want to provide an ImageGetter, TagHandler and SpanCallback:
//Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
// imageGetter, tagHandler, spanCallback);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);
Ich weiß, dass diese Frage alt ist. Andere Antworten hier schlagen die Html.fromHtml()
method vor. Ich empfehle Ihnen, das HtmlCompat.fromHtml()
aus dem Android.support.v4.text.HtmlCompat
-Paket zu verwenden. Da dies eine abwärtskompatible Version der Klasse Html
ist.
Beispielcode:
import Android.support.v4.text.HtmlCompat;
import Android.text.Spanned;
import Android.widget.TextView;
String htmlString = "<h1>Hello World!</h1>";
Spanned spanned = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT);
TextView tvOutput = (TextView) findViewById(R.id.text_view_id);
tvOutput.setText(spanned);
Auf diese Weise können Sie die Überprüfung der Android-API-Version vermeiden und es ist einfach zu verwenden (Einzeilenlösung).
Wenn Sie eine benutzerdefinierte Textansicht schreiben, wird die grundlegende HTML-Textfunktion von einigen Geräten verschwunden.
Wir müssen also die folgenden zusätzlichen Schritte machen, um die Arbeit zu machen
public class CustomTextView extends TextView {
public CustomTextView(..) {
// other instructions
setText(Html.fromHtml(getText().toString()));
}
}
public class HtmlTextView extends AppCompatTextView {
public HtmlTextView(Context context) {
super(context);
init();
}
private void init(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setText(Html.fromHtml(getText().toString(), Html.FROM_HTML_MODE_COMPACT));
} else {
setText(Html.fromHtml(getText().toString()));
}
}
}
aktualisierung von Antwort oben
Darf ich eine etwas hackige, aber dennoch geniale Lösung vorschlagen? Ich habe die Idee von diesem Artikel und für Android angepasst. Grundsätzlich verwenden Sie eine WebView
und fügen den HTML-Code, den Sie anzeigen und bearbeiten möchten, in ein editierbares div-Tag ein. Wenn der Benutzer auf die Variable WebView
tippt, wird auf diese Weise die Tastatur angezeigt und die Bearbeitung kann erfolgen. Sie fügen nur etwas JavaScript hinzu, um das bearbeitete HTML und voila wiederzuerlangen!
Hier ist der Code:
public class HtmlTextEditor extends WebView {
class JsObject {
// This field always keeps the latest edited text
public String text;
@JavascriptInterface
public void textDidChange(String newText) {
text = newText.replace("\n", "");
}
}
private JsObject mJsObject;
public HtmlTextEditor(Context context, AttributeSet attrs) {
super(context, attrs);
getSettings().setJavaScriptEnabled(true);
mJsObject = new JsObject();
addJavascriptInterface(mJsObject, "injectedObject");
setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
loadUrl(
"javascript:(function() { " +
" var editor = document.getElementById(\"editor\");" +
" editor.addEventListener(\"input\", function() {" +
" injectedObject.textDidChange(editor.innerHTML);" +
" }, false)" +
"})()");
}
});
}
public void setText(String text) {
if (text == null) { text = ""; }
String editableHtmlTemplate = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta name=\"viewport\" content=\"initial-scale=1.0\" />" + "</head>" + "<body>" + "<div id=\"editor\" contenteditable=\"true\">___REPLACE___</div>" + "</body>" + "</html>";
String editableHtml = editableHtmlTemplate.replace("___REPLACE___", text);
loadData(editableHtml, "text/html; charset=utf-8", "UTF-8");
// Init the text field in case it's read without editing the text before
mJsObject.text = text;
}
public String getText() {
return mJsObject.text;
}
}
Und hier ist die Komponente als Gist.
Hinweis: Ich habe den Höhenänderungs-Callback der ursprünglichen Lösung nicht benötigt. Das fehlt hier, aber Sie können ihn bei Bedarf problemlos hinzufügen.
Wenn Sie in Ihrem Projekt androidx.
* -Klassen verwenden, sollten Sie HtmlCompat.fromHtml(text, flag)
verwenden. Quelle der Methode ist:
@NonNull public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) { if (Build.VERSION.SDK_INT >= 24) { return Html.fromHtml(source, flags); } //noinspection deprecation return Html.fromHtml(source); }
Es ist besser als Html.fromHtml, da es weniger Code gibt, nur eine Zeile und die empfohlene Verwendung.