TextView में HTML कैसे प्रदर्शित करें?


756

मेरे पास सरल HTML है :

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

मैं HTML स्टाइल टेक्स्ट को इसमें प्रदर्शित करना चाहता हूं TextView। यह कैसे करना है?


7
क्या आप टैग प्रदर्शित करना चाहते हैं या उन्हें छोड़ना चाहते हैं?
डेराइक

1
वर्किंग उदाहरण के लिए इस लिंक को देखें javatechig.com/2013/04/07/how-to-display-html-in-android-view
नीलांचल

1
यदि आप पदावनत समाधान की तलाश में हैं, तो यह यहीं है stackoverflow.com/questions/37904739/…
crgarridos

जवाबों:


1350

आपको Html.fromHtml()अपने XML स्ट्रिंग्स में HTML का उपयोग करने की आवश्यकता है । बस अपने लेआउट में HTML के साथ एक स्ट्रिंग को संदर्भित करना XML काम नहीं करेगा।

यही आपको करना चाहिए:

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>"));
}

7
h2परिभाषा के अनुसार अपने आप में बहुत अंतर पैदा करता है। और pकुछ मार्जिन के साथ भी आता है। यदि आप अंतर नहीं चाहते हैं, तो आप अन्य HTML तत्वों का उपयोग करने पर विचार कर सकते हैं।
डेविड हेडलंड

10
कोस्टाडिन, आप एक्सएमएल में टैग लगा सकते हैं, आपको बस उन्हें सीडीएटीए ब्रैकेट में लपेटने की आवश्यकता है।
गेरार्ड

3
उन लोगों के लिए जो इसे ol / ul / li टैग के साथ काम करना चाहते हैं, इस समाधान को देखें: stackoverflow.com/a/3150456/1369016
Tiago

13
वह होना चाहिए android.text.Html.fromHtml। मुझे पता है कि अधिकांश IDE आपके लिए इसे ठीक कर देंगे लेकिन पठनीयता के लिए पैकेज के नामों को जानना अच्छा होगा।
मार्टिन

14
@ मर्टिन मैं पठनीयता के लिए नहीं बल्कि थकावट के लिए कहूंगा । IMO पूरी तरह से योग्य नामों को सीधे कोड में उपयोग किया जाता है जैसे कि यह छोटे नामों की तुलना में कम पठनीय होते हैं। लेकिन मैं आपके साथ इस तथ्य पर सहमत हूं कि इस तरह का उत्तर पैकेज (एक साइड नोट पर) प्रदान करना चाहिए, जो यहां लिंक का बिंदु है;)
जोफ्रे

76

setText (Html.fromHtml (bodyData)) है पदावनत एपीआई 24. के बाद अब आप यह करने के लिए है:

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

4
API 24+ में FROM_HTML_MODE_LEGACY का उपयोग क्यों किया जाता है?
गैल्सीयूरियो

64

इस पर एक नज़र: https://stackoverflow.com/a/8558249/450148

यह बहुत अच्छा है !!

<resource>
    <string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>

यह केवल कुछ टैग के लिए काम करता है।


12
क्या इस विधि द्वारा समर्थित टैग की कोई सूची है?
Mente

23
@mente स्रोत कोड के अनुसार : <a>, <b>, <big>, <blockquote>, <br>, <cite>, <dfn> <div align = "...">, <em>, <। फ़ॉन्ट का आकार = "..." रंग = "..." चेहरा = "..."> <h1-6>, <i>, <img src = "...">, <p>, <small > <हड़ताल> <strong>, <sub>, <sup>, <tt> <u> (स्रोत: dzone.com/snippets/how-display-html-android )
JerabekJakub

@JerabekJakub लेकिन ध्यान रखें, अगर आप img को संभालने जा रहे हैं तो आपको Html.ImageGetter को लागू करना होगा।
मिगेलहिनकेपीसी

@ 0mahc0 जब किसी एक imgments img का आकार निर्धारित करना संभव है?
जोह

1
@ जो हो सके इसके। जब आप कार्यान्वित कर रहे होते हैं ।ImageGetter, एक विधि है जिसे getDrawable (स्ट्रिंग स्रोत) कहा जाता है। यदि आपको अधिक सहायता की आवश्यकता है, तो एक प्रश्न बनाएं और मुझे टैग करें, मैं आपको एक उदाहरण दूंगा;)
मिगुएलहिनकपी

41

आप इस विचार से सहायक हो सकता आप जावा कोड में किसी भी संशोधन के बिना एक्सएमएल के माध्यम से यह कॉन्फ़िगर करने के लिए सक्षम होने के लिए चाहते हैं। बस आप निर्माता से init को कॉल करते हैं और टेक्स्ट को 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"/>

1
क्या '...' है। कृपया स्पष्ट करें
गिल्बर्टएस

25

यदि आप HTML को स्ट्रिंग संसाधन आईडी से दिखाने का प्रयास कर रहे हैं, तो स्वरूपण स्क्रीन पर दिखाई नहीं दे सकता है। कि आप के लिए हो रहा है, तो इसके बजाय CDATA टैग का उपयोग का प्रयास करें:

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

अधिक जानकारी के लिए इस पोस्ट को देखें।


धन्यवाद, यह मेरे लिए था- एपीआई 23 का उपयोग करते हुए।
XMAN

24

नीचे दिए गए कोड मेरे लिए सबसे अच्छा परिणाम दे दी है।

TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);

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

आप लंगर का रंग कैसे बदलते हैं?
EdmundYeung99 15

Android: textColorLink = "color"
पेड्रो

यह पूरे टेक्स्टव्यू को लाल रंग में रंग देगा, लेकिन अगर मैं केवल एंकर टैग चाहता हूं, तो मुझे <font> टैग के साथ <a> टैग को लपेटना होगा और वहां रंग जोड़ना होगा
EdmundYeung99

11

यदि आप केवल कुछ html पाठ प्रदर्शित करना चाहते हैं और वास्तव में इसकी आवश्यकता नहीं है TextView, तो एक WebViewका उपयोग करें और इसे निम्नलिखित की तरह उपयोग करें:

String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);

यह आपको कुछ html टैग तक सीमित नहीं करता है।


2
जबकि यह TextView द्वारा समर्थित HTML टैग्स के प्रतिबंधित सेट के चारों ओर जाने के लिए एक बहुत ही उपयोगी तरीका है, लेकिन इसका नुकसान यह है कि यह अच्छी तरह से काम नहीं करता हैlayout_height="wrap_content" । आपको इसके बजाय एक स्पष्ट ऊँचाई या माचिस सेट करनी होगी।
Ridcully

3
webview बहुत धीमा है
Jackky777

11

सबसे अच्छा तरीका strings.xml फ़ाइल में स्ट्रिंग के लिए CDATA भाग का उपयोग करने के लिए नीचे दिए गए कोड स्निपेट TextView के लिए html सामग्री की एक वास्तविक प्रदर्शन प्राप्त करने के लिए आप उचित विचार दे देंगे।

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

स्ट्रिंग टेक्स्ट में सीडीटा सेक्शन String.format मेथड का उपयोग करके टेक्स्ट को फॉर्मेट करने के बाद भी html टैग डेटा को बरकरार रखता है। तो, Html.fromHtml (एसटीआर) ठीक काम करता है और आप में आपका स्वागत है संदेश में बोल्ड टेक्स्ट देखेंगे।

आउटपुट:

आपका स्वागत है, अपने पसंदीदा संगीत app की दुकान करने के लिए। के रूप में लॉग इन करें: उपयोगकर्ता नाम


धन्यवाद, यह मेरे लिए था- एपीआई 23 का उपयोग करते हुए।
XMAN

धन्यवाद, u ने मेरा दिन बचा लिया :) बस एक छोटा सा जोड़: हमें इस चेक को उपरोक्त कोड में जोड़ने की आवश्यकता है: if (Build.VERSION.SDK_INT> = Build.VERSION_CODES.N) {// 24 api और moreViewView.setText (के लिए) Html.fromHtml (welcomStr, Html.FROM_HTML_OPTION_USE_CSS_COLORS)); } और {// या पुराने एपीआई textView.setText (Html.fromHtml (welcomStr)) के लिए; }। API> = 24 के लिए 2 पैरामीटर ध्वज का मान, आवश्यकता के अनुसार कुछ भी हो सकता है।
AndroidGuy

10

यह ध्यान देने योग्य है कि विधि Html.fromHtml (स्ट्रिंग स्रोत) एपीआई स्तर 24 के रूप में पदावनत है। यदि यह आपका लक्ष्य एपीआई है, तो आपको इसके बजाय Html.fromHtml (स्ट्रिंग स्रोत, int ध्वज) का उपयोग करना चाहिए ।


6

मैं निम्नलिखित प्रोजेक्ट का सुझाव भी देना चाहूंगा: https://github.com/NightWhistler/HtmlSpanner

उपयोग लगभग डिफ़ॉल्ट एंड्रॉइड कनवर्टर के समान है:

(new HtmlSpanner()).fromHtml()

यह मेरे द्वारा पहले ही शुरू कर दिया गया था कि html के अपने कार्यान्वयन के लिए स्पैनेबल कनवर्टर द्वारा शुरू किया गया है, क्योंकि मानक Html.fromHtml नियंत्रण प्रदान करने के लिए पर्याप्त लचीलापन प्रदान नहीं करता है और यहां तक ​​कि ttf से कस्टम फोंट का उपयोग करने की कोई संभावना नहीं है।


मुझे निम्न त्रुटि हो रही है: त्रुटि: (80, 13) हल करने में विफल: com.osbcp.cssparser: cssparser: 1.5 मैं इसे कैसे हल करूं?
अराजू

6

मुझे पता है कि यह सवाल पुराना है। अन्य उत्तर यहाँ सुझाव Html.fromHtml()विधि है। मैं आपको पैकेज HtmlCompat.fromHtml()से उपयोग करने का सुझाव देता हूं androidx.core.text.HtmlCompat। जैसा कि यह Htmlवर्ग का पिछड़ा संगत संस्करण है ।

नमूना कोड:

import androidx.core.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);

इस तरह से आप एंड्रॉयड एपीआई संस्करण की जांच से बच सकते हैं और यह उपयोग (एकल लाइन समाधान) आसान है।


यह पुराने मैथोट से अलग कैसे है? HTML मोड का उद्देश्य क्या है?
user1209216

1
कुछ इस तरह देख रहा था। धन्यवाद :)
सुभ्रज्योति सेन

5

सरल उपयोग Html.fromHtml("html string")। यह काम करेगा। यदि स्ट्रिंग में टैग हैं <h1>तो रिक्त स्थान आएंगे। लेकिन हम उन जगहों को खत्म नहीं कर सकते। यदि आप अभी भी रिक्त स्थान हटाना चाहते हैं, तो आप स्ट्रिंग में टैग हटा सकते हैं और फिर स्ट्रिंग को विधि में पास कर सकते हैं Html.fromHtml("html string");। आम तौर पर ये तार सर्वर (डायनेमिक) से आते हैं, लेकिन अक्सर नहीं, अगर स्ट्रिंग को पास करना बेहतर होता है क्योंकि यह विधि से है स्ट्रिंग से टैग को हटाने की कोशिश करें।



4

एक वैश्विक विधि बनाएं जैसे:

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;
        }

आप इसे अपनी गतिविधि / प्रसार में भी उपयोग कर सकते हैं जैसे:

text_view.setText(stripHtml(htmlText));

3

मैंने वेब दृश्य का उपयोग करके इसे लागू किया है। मेरे मामले में मुझे पाठ दृश्य में पाठ के साथ URL से छवि लोड करनी है और यह मेरे लिए काम करता है।

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

UTF-8 के उचित प्रदर्शन के लिए आपको MIME प्रकार को "टेक्स्ट / html; चारसेट = UTF-8" पर सेट करना होगा।
शकीनाकॉव

3

एचटीएमएल फ्रेमवर्क वर्ग का उपयोग करने के लिए विभिन्न उत्तरों के माध्यम से सुझाव दिया गया है जैसा कि यहां बताया गया है, लेकिन दुर्भाग्य से इस वर्ग में एंड्रॉइड के विभिन्न संस्करणों और विभिन्न अनसुनी बग्स में अलग-अलग व्यवहार है, जैसा कि 214637 , 14778 , 235128 और 75953 के मुद्दों में दिखाया गया है ।

इसलिए आप Android संस्करणों में Html वर्ग के मानकीकरण और बैकपोर्ट के लिए एक संगतता पुस्तकालय का उपयोग करना चाह सकते हैं जिसमें तत्वों और स्टाइल के लिए अधिक कॉलबैक शामिल हैं:

Github प्रोजेक्ट HtmlCompat

हालांकि यह फ्रेमवर्क के एचटीएमएल वर्ग के समान है, अधिक कॉलबैक की अनुमति देने के लिए कुछ हस्ताक्षर परिवर्तनों की आवश्यकता थी। यहाँ 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);

@MartijnPieters पहले बंद किए गए उत्तर एक फ्रेमवर्क विधि के पदावनति के संबंध में इस प्रश्न के उत्तर का एक डुप्लिकेट था । मैंने इस कारण पर विस्तार किया है कि संगतता पुस्तकालय का उपयोग करना बेहतर दृष्टिकोण होगा। मुझे नहीं लगता कि यह एक दूसरे के डुप्लिकेट के रूप में या तो सवाल करना उचित है क्योंकि वे स्पष्ट रूप से अलग हैं।
पॉल लामर्ट्समा

2

जब भी आप कस्टम टेक्स्ट व्यू लिखते हैं तो बेसिक HTML सेट टेक्स्ट फीचर को कुछ डिवाइसों से गायब कर दिया जाएगा।

तो हम निम्नलिखित addtional कदम बनाने की जरूरत है काम है

public class CustomTextView extends TextView {

    public CustomTextView(..) {
        // other instructions
        setText(Html.fromHtml(getText().toString()));
    }
}

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

उत्तर का अद्यतन


1

समाधान प्राप्त करने के लिए नीचे दिए गए कोड का उपयोग करें:

textView.setText(fromHtml("<Your Html Text>"))

यूटिलिटी विधि

public static Spanned fromHtml(String text)
{
    Spanned result;
    if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        result = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY);
    } else {
        result = Html.fromHtml(text);
    }
    return result;
}

1

Html को स्ट्रिंग से परिवर्तित करने के लिए कोटलिन एक्सटेंशन बनाया गया -

fun String?.toHtml(): Spanned? {
    if (this.isNullOrEmpty()) return null
    return HtmlCompat.fromHtml(this, HtmlCompat.FROM_HTML_MODE_COMPACT)
}

0

मैं कुछ हद तक अभी भी प्रतिभाशाली समाधान सुझा सकते हैं! मुझे इस लेख से विचार मिला और इसे एंड्रॉइड के लिए अनुकूलित किया। मूल रूप से आप एक का उपयोग करते हैं WebViewऔर उस HTML को सम्मिलित करते हैं जिसे आप संपादन योग्य div टैग में दिखाना और संपादित करना चाहते हैं। इस तरह जब उपयोगकर्ता टैप करता है WebViewतो कीबोर्ड दिखाई देता है और संपादन की अनुमति देता है। वे आपके द्वारा संपादित किए गए HTML और वॉइला को वापस लाने के लिए कुछ जावास्क्रिप्ट जोड़ते हैं!

यहाँ कोड है:

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;
    }
}

और यहाँ एक जिस्ट के रूप में घटक है।

नोट: मुझे मूल समाधान से ऊंचाई परिवर्तन कॉलबैक की आवश्यकता नहीं थी, इसलिए यहां गायब है, लेकिन यदि आवश्यक हो तो आप इसे आसानी से जोड़ सकते हैं।


0

यदि आप androidx.अपनी परियोजना में * वर्गों का उपयोग करते हैं, तो आपको उपयोग करना चाहिए HtmlCompat.fromHtml(text, flag)। विधि का स्रोत है:

@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); }

यह Html.fromHtml से बेहतर तरीका है क्योंकि इसमें कम कोड है, केवल एक लाइन है, और इसे इस्तेमाल करने के लिए अनुशंसित तरीका है।


0

आप इस तरह सरल कोटलिन एक्सटेंशन फ़ंक्शन का उपयोग कर सकते हैं:

fun TextView.setHtmlText(source: String) {
    this.text = HtmlCompat.fromHtml(source, HtmlCompat.FROM_HTML_MODE_LEGACY)
}

और उपयोग:

textViewMessage.setHtmlText("Message: <b>Hello World</b>")

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.