Comment afficher du HTML dans TextView?
18 réponses
vous devez utiliser Html.fromHtml()
pour utiliser HTML dans vos chaînes XML. Il suffit de faire référence à une chaîne de caractères HTML dans votre mise en page XML ne fonctionnera pas.
par exemple ( par exemple (>=Nougat Android): pour distinguer les versions Android utiliser myTextView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
myTextView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
Build.VERSION.SDK_INT >= Build.VERSION_CODES.N
.
Regardez ceci: https://stackoverflow.com/a/8558249/450148
C'est très bon aussi!!
<resource>
<string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>
cela ne fonctionne que pour quelques tags.
setText(Html.fromHtml(bodyData)) est obsolète après api 24. Maintenant vous devez faire ceci:
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));
}
si vous voulez pouvoir le configurer par xml sans aucune modification dans le code java, vous pouvez trouver cette idée utile. Il vous suffit d'appeler INIT à partir du constructeur et de définir le texte comme 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"/>
le code ci-dessous a donné le meilleur résultat pour moi.
TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
si vous essayez d'afficher du HTML à partir d'un id de Ressource de chaîne, le formatage peut ne pas apparaître à l'écran. Si cela vous arrive, essayez D'utiliser des tags CDATA à la place:
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));
de cette post pour plus de détails.
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());
si vous voulez juste afficher du texte html et que vous n'avez pas vraiment besoin d'un TextView
, alors prenez un WebView
et utilisez-le comme suit:
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
cela ne vous limite pas non plus à quelques balises html.
il est intéressant de mentionner que la méthode Html.fromHtml (String source) est déprécié au niveau API 24. Si c'est votre API cible, vous devez utiliser Html.fromHtml (String source, drapeaux int) à la place.
la meilleure approche pour utiliser des sections CData pour la chaîne dans les chaînes.fichier xml pour obtenir un affichage réel du contenu html dans le TextView l'extrait de code ci-dessous vous donnera une bonne idée.
//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));
la section CData dans le texte de chaîne garde les données de balise html intactes même après le formatage du texte à L'aide de chaîne.méthode de mise en forme. So, Html.fromHtml (str) fonctionne bien et vous verrez le texte en gras dans le message de bienvenue.
sortie:
Bienvenue dans votre app store préféré. Connecté en tant que: nom d'utilisateur
je voudrais également suggérer le projet suivant: https://github.com/NightWhistler/HtmlSpanner
L'utilisation est presque la même que le convertisseur android par défaut:
(new HtmlSpanner()).fromHtml()
L'a trouvé après que j'ai déjà commencé par sa propre implémentation de html à spannable convertisseur, parce que Html standard.fromHtml ne fournit pas assez de flexibilité sur le contrôle de rendu et même pas de possibilité d'utiliser des polices personnalisées à partir de ttf
utilisation Simple Html.fromHtml("html string")
. Ce sera le travail. Si la chaîne a des balises comme <h1>
alors les espaces viendront. Mais nous ne pouvons pas éliminer ces espaces. Si vous souhaitez supprimer les espaces, vous pouvez supprimer les balises de la chaîne, puis de passer la chaîne à la méthode Html.fromHtml("html string");
. Aussi généralement ces chaînes viennent de server (dynamic) mais pas souvent, si c'est le cas mieux passer la chaîne comme elle est à la méthode que d'essayer de supprimer les tags de la chaîne.
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
j'ai implémenté ceci en utilisant web view. Dans mon cas, je dois charger l'image de L'URL avec le texte dans la vue de texte et cela fonctionne pour moi.
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);
il a été suggéré à travers diverses réponses d'utiliser la classe de cadre Html comme suggéré ici, mais malheureusement cette classe a un comportement différent dans différentes versions D'Android et divers bogues non adressés, comme démontré dans les questions 214637 , 14778 , 235128 et 75953 .
vous pouvez donc utiliser une bibliothèque de compatibilité pour normaliser et rétroporter la classe Html à travers les versions Android qui comprend plus de callbacks pour les éléments et le style:
bien qu'il soit similaire à la classe Html du framework, certains changements de signature ont été nécessaires pour permettre plus de callbacks. Voici l'échantillon de la page GitHub:
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);
chaque fois que vous écrivez la fonctionnalité de base de texte de vue de texte HTML sera disparu de certains des appareils.
nous devons donc suivre les étapes supplémentaires faire est de travail
public class CustomTextView extends TextView {
//Dans le constructeur
setText(Html.fromHtml(getText().toString()));
}
faire une méthode globale comme:
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;
}
vous pouvez également l'utiliser dans votre activité / Fragment comme:
text_view.setText(stripHtml(htmlText));
puis-je Suggérer une solution un peu hacky mais toujours de génie! J'ai eu l'idée de cet article et l'a adapté pour Android. Fondamentalement, vous utilisez un WebView
et insérez le HTML que vous voulez afficher et éditez dans une balise editable div. De cette façon, lorsque l'utilisateur tape le WebView
le clavier apparaît et permet l'édition. Vous n'avez qu'à ajouter du JavaScript pour récupérer le HTML modifié et voilà!
voici le 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;
}
}
Et ici est le composant sous la forme d'un Résumé.
Note: je n'ai pas eu besoin du rappel de changement de hauteur de la solution originale donc qui est absent ici, mais vous pouvez facilement l'ajouter si nécessaire.