Comment afficher du HTML dans TextView?

j'ai simple HTML :

<h2>Title</h2><br>
<p>description here</p>

je veux afficher le texte HTML dans TextView . Comment faire cela?

637
demandé sur UMAR 2010-01-22 12:14:22

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 (

myTextView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));

par exemple (>=Nougat Android):

myTextView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));

pour distinguer les versions Android utiliser Build.VERSION.SDK_INT >= Build.VERSION_CODES.N .

1129
répondu Timo Bähr 2017-02-05 08:48:18

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.

59
répondu Felipe Micaroni Lalli 2017-05-23 12:02:50

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));
 }
59
répondu Shohan Ahmed Sijan 2017-01-11 07:40:04

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"/>
37
répondu user1299412 2014-12-13 20:20:56

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);
21
répondu Rajiv Manivannan 2017-06-22 15:06:46

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.

16
répondu Phileo99 2017-05-23 10:31:36
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());
11
répondu Pedro 2014-12-02 13:15:45

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.

10
répondu prom85 2015-06-26 13:51:38

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.

10
répondu Teo Inke 2016-06-22 05:31:34

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

10
répondu Rajendhiran Easu 2016-08-19 11:59:47

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

6
répondu Fedotchenco Denis 2015-03-12 08:15:43

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.

5
répondu nole 2014-05-11 00:01:09
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
4
répondu samuel gildas 2016-01-27 12:40:40

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);
3
répondu Killer 2015-12-04 11:18:34

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:

projet Github HtmlCompat

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);
2
répondu Paul Lammertsma 2018-03-15 08:26:02

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()));

}

2
répondu Vinayak 2018-08-17 06:10:49

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));
0
répondu Shylendra Madda 2018-09-20 16:39:24

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.

0
répondu AXE 2018-09-27 07:10:30