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 उपयोग करें |