Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Android

Android TextView में HTML प्रदर्शित करना

HtmlCompat का उपयोग (अनुशंसित)

AndroidX HtmlCompat API लेवल के अनुसार सही इंप्लीमेंटेशन चुनता है और पुराने वर्जन पर क्रैश से बचाता है।

बुनियादी उपयोग

import androidx.core.text.HtmlCompat;

String htmlText = "<h2>शीर्षक</h2><p>यह <b>बोल्ड</b> और <i>इटैलिक</i> टेक्स्ट है।</p>";

// API 24+ (fromHtml में flags पैरामीटर)
textView.setText(HtmlCompat.fromHtml(htmlText, HtmlCompat.FROM_HTML_MODE_LEGACY));

// या सरल (डिफ़ॉल्ट व्यवहार)
textView.setText(HtmlCompat.fromHtml(htmlText, 0));

समर्थित HTML टैग्स

टैगप्रभावनोट्स
<b>, <strong>बोल्डपूरी तरह सपोर्टेड
<i>, <em>, <cite>, <dfn>इटैलिकपूरी तरह सपोर्टेड
<u>अंडरलाइनAPI 24+
<strike>, <s>, <del>स्ट्राइकथ्रूAPI 24+
<sup>, <sub>सुपरस्क्रिप्ट/सबस्क्रिप्टAPI 24+
<big>, <small>फॉन्ट आकारडिप्रिकेटेड लेकिन काम करता है
<font color="red">रंगकेवल नाम/हैक्स, RGB नहीं
<font face="monospace">फॉन्ट फेससीमित सपोर्ट
<blockquote>इंडेंटब्लॉक कोट
<br>लाइन ब्रेकपूरी तरह सपोर्टेड
<p>पैराग्राफमार्जिन के साथ
<ul>, <ol>, <li>सूचियाँबेसिक सपोर्ट
<a href="...">लिंकMovementMethod चाहिए
<img src="...">इमेजImageGetter चाहिए

पूर्ण उदाहरण: रिच HTML कंटेंट

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="https://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView
        android:id="@+id/htmlTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="16sp"
        android:lineSpacingMultiplier="1.2"
        android:autoLink="web"
        android:linksClickable="true"
        android:textColorLink="#1976D2" />

</LinearLayout>

MainActivity.java

import android.os.Bundle;
import android.text.Html;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.text.HtmlCompat;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView htmlTextView = findViewById(R.id.htmlTextView);

        String htmlContent = 
            "<h2>Android क्या है?</h2>\n" +
            "<p>Android एक <b>ओपन सोर्स</b> और <i>Linux-आधारित</i> " +
            "<b>ऑपरेटिंग सिस्टम</b> है मोबाइल डिवाइसेज के लिए जैसे " +
            "स्मार्टफोन और टैबलेट कंप्यूटर।</p>\n" +
            "<p>इसका विकास <a href='https://source.android.com/'>ओपन हैंडसेट अलायंस</a> " +
            "द्वारा किया गया, जिसका नेतृत्व Google ने किया।</p>\n" +
            "<ul>\n" +
            "  <li>एकीकृत ऐप विकास दृष्टिकोण</li>\n" +
            "  <li>विभिन्न डिवाइसेज पर चलता है</li>\n" +
            "  <li>पहला कमर्शियल वर्जन: Android 1.0 (सितंबर 2008)</li>\n" +
            "</ul>\n" +
            "<blockquote>\n" +
            "  <p>"Android विकास को सरल बनाता है।"</p>\n" +
            "</blockquote>";

        // HTML पार्स करें
        Spanned spanned = HtmlCompat.fromHtml(htmlContent, HtmlCompat.FROM_HTML_MODE_LEGACY);
        
        // टेक्स्टव्यू में सेट करें
        htmlTextView.setText(spanned);
        
        // लिंक क्लिक करने योग्य बनाने के लिए (जरूरी!)
        htmlTextView.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

इमेज के साथ HTML (ImageGetter)

String htmlWithImage = "<p>इमेज: <img src='logo'> </p>";

Spanned spanned = HtmlCompat.fromHtml(htmlWithImage, HtmlCompat.FROM_HTML_MODE_LEGACY, 
    new Html.ImageGetter() {
        @Override
        public Drawable getDrawable(String source) {
            // source = "logo"
            int resId = getResources().getIdentifier(source, "drawable", getPackageName());
            if (resId != 0) {
                Drawable drawable = ContextCompat.getDrawable(MainActivity.this, resId);
                if (drawable != null) {
                    drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
                    return drawable;
                }
            }
            return null;
        }
    }, null);

textView.setText(spanned);

क्लिक करने योग्य लिंक्स (LinkMovementMethod)

// XML में या कोड में:
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setLinkTextColor(Color.BLUE); // लिंक रंग
textView.setHighlightColor(Color.TRANSPARENT); // हाइलाइट रंग

// कस्टम क्लिक हैंडलिंग के लिए
textView.setOnTouchListener((v, event) -> {
    // कस्टम लॉजिक
    return false; // डिफ़ॉल्ट हैंडलिंग जारी रखने के लिए
});

सुरक्षा: HTML सैनिटाइज़ेशन

अनट्रस्टेड HTML (उपयोगकर्ता इनपुट, सर्वर से) रेंडर करते समय XSS से बचें:

// Jsoup लाइब्रेरी उपयोग करें (build.gradle में जोड़ें)
// implementation 'org.jsoup:jsoup:1.16.1'

import org.jsoup.Jsoup;
import org.jsoup.safety.Safelist;

String unsafeHtml = "<script>alert('xss')</script><b>बोल्ड</b>";
String safeHtml = Jsoup.clean(unsafeHtml, Safelist.basic()); // केवल सुरक्षित टैग्स रखता है
// परिणाम: "<b>बोल्ड</b>" (स्क्रिप्ट हटा दिया गया)

Spanned spanned = HtmlCompat.fromHtml(safeHtml, HtmlCompat.FROM_HTML_MODE_LEGACY);
textView.setText(spanned);

प्रदर्शन टिप्स

  • बड़े HTML के लिए बैकग्राउंड थ्रेड पर पार्स करें: HtmlCompat.fromHtml() को IO थ्रेड पर चलाएं
  • RecyclerView में: ViewHolder में कैश करें या DiffUtil के साथ प्री-कंप्यूट करें
  • FROM_HTML_MODE_COMPACT (API 24+) अधिक कुशल है
  • बार-बार सेट करने से बचें - केवल जब कंटेंट बदले

सामान्य समस्याएं

समस्यासमाधान
लिंक काम नहीं करतेsetMovementMethod(LinkMovementMethod.getInstance()) सेट करें
इमेज नहीं दिखतीImageGetter इंप्लीमेंट करें जो Drawable रिटर्न करे
टैग्स अनदेखेकेवल समर्थित टैग्स काम करते हैं; CSS स्टाइल्स काम नहीं करते
रंग काम नहीं करते<font color="#FF0000"> उपयोग करें, RGB फंक्शन नहीं
क्रैश API < 24 परHtmlCompat.fromHtml(html, 0) या FROM_HTML_MODE_LEGACY उपयोग करें
  1. एंड्रॉइड में टोस्ट कैसे प्रदर्शित करें? एंड्रॉइड में टोस्ट कैसे प्रदर्शित करें?

    एंड्रॉइड में Toast संदेश दिखाने का बुनियादी उदाहरण यह उदाहरण दर्शाता है कि Toast.makeText() का उपयोग करके सरल टोस्ट संदेश कैसे प्रदर्शित करें। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project चुनें। चरण 2: लेआउट (ConstraintLayout) res/layout/activity_main.xml: <?xml version=1.0

  1. एंड्रॉइड में HTML कैसे पार्स करें? एंड्रॉइड में HTML कैसे पार्स करें?

    Jsoup लाइब्रेरी के साथ HTML पार्सिंग यह उदाहरण दर्शाता है कि Jsoup लाइब्रेरी का उपयोग करके वेबसाइट से HTML डाउनलोड करें और टाइटल, लिंक निकालें। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project चुनें। चरण 2: लेआउट में बटन और TextView res/layout/activity_main.xml: <?xml version=1.

  1. Android TextView में टेक्स्ट को जस्टिफाई कैसे करें? Android TextView में टेक्स्ट को जस्टिफाई कैसे करें?

    TextView में टेक्स्ट जस्टिफिकेशन Android 8.0 (API 26) से android:justificationMode=inter_word एट्रिब्यूट का उपयोग करके TextView में टेक्स्ट को जस्टिफाई (दोनों किनारों पर संरेखित) किया जा सकता है। चरण 1: नया प्रोजेक्ट बनाएं Android Studio में File → New Project चुनें (न्यूनतम API 26 या अधिक)। चरण 2