जवाबों:
अद्यतन : जैसा कि @Andy ने नीचे उल्लेख किया है कि Google ने बनाया है HtmlCompat
जिसका उपयोग नीचे की विधि के बजाय किया जा सकता है। इस निर्भरता implementation 'androidx.core:core:1.0.1
को अपने ऐप की बिल्ड.ग्रेड फ़ाइल में जोड़ें । सुनिश्चित करें कि आप नवीनतम संस्करण का उपयोग करते हैं androidx.core:core
।
यह आपको उपयोग करने की अनुमति देता है:
HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);
आप HtmlCompat-प्रलेखन पर विभिन्न झंडे के बारे में अधिक पढ़ सकते हैं
मूल उत्तर:
Android N में उन्होंने एक नया Html.fromHtml
तरीका पेश किया । Html.fromHtml
अब एक अतिरिक्त पैरामीटर की आवश्यकता है, जिसका नाम है झंडे। यह ध्वज आपको इस बारे में अधिक नियंत्रण देता है कि आपका HTML कैसे प्रदर्शित होता है।
Android N और इसके बाद के संस्करण पर आपको इस नई विधि का उपयोग करना चाहिए। पुराने तरीके को हटा दिया गया है और भविष्य के एंड्रॉइड संस्करणों में हटाया जा सकता है।
आप अपना खुद का यूटिल-मेथड बना सकते हैं जो पुराने वर्जन पर पुराने तरीके और एंड्रॉइड एन और उससे ऊपर के नए तरीके का उपयोग करेगा। यदि आप एक संस्करण नहीं जोड़ते हैं तो चेक करें कि आपका ऐप निम्न Android संस्करणों पर टूट जाएगा। आप इस विधि का उपयोग अपने Util क्लास में कर सकते हैं।
@SuppressWarnings("deprecation")
public static Spanned fromHtml(String html){
if(html == null){
// return an empty spannable if the html is null
return new SpannableString("");
}else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
// FROM_HTML_MODE_LEGACY is the behaviour that was used for versions below android N
// we are using this flag to give a consistent behaviour
return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
} else {
return Html.fromHtml(html);
}
}
HTML.FROM_HTML_MODE_LEGACY
यदि आप चाहें तो आप एक अतिरिक्त पैरामीटर में बदल सकते हैं। यह आपको इसके बारे में अधिक नियंत्रण देता है कि कौन सा ध्वज उपयोग करना है।
आप Html वर्ग प्रलेखन पर विभिन्न झंडे के बारे में अधिक पढ़ सकते हैं
Html.FROM_HTML_MODE_LEGACY
//noinspection deprecation
के else
लिए।
मेरे पास इन चेतावनियों का एक बहुत कुछ था और मैं हमेशा FROM_HTML_MODE_LEGACY का उपयोग करता हूं इसलिए मैंने HtmlCompat नामक एक सहायक वर्ग बनाया, जिसमें निम्नलिखित शामिल हैं:
@SuppressWarnings("deprecation")
public static Spanned fromHtml(String source) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(source, Html.FROM_HTML_MODE_LEGACY);
} else {
return Html.fromHtml(source);
}
}
FromHtml () के झंडे की तुलना करें।
<p style="color: blue;">This is a paragraph with a style</p>
<h4>Heading H4</h4>
<ul>
<li style="color: yellow;">
<font color=\'#FF8000\'>li orange element</font>
</li>
<li>li #2 element</li>
</ul>
<blockquote>This is a blockquote</blockquote>
Text after blockquote
Text before div
<div>This is a div</div>
Text after div
या आप उपयोग कर सकते हैं androidx.core.text.HtmlCompat
:
HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)
यदि आप कोटलिन पर विकसित करने के लिए पर्याप्त भाग्यशाली हैं, तो एक एक्सटेंशन फ़ंक्शन बनाएं:
fun String.toSpanned(): Spanned {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(this, Html.FROM_HTML_MODE_LEGACY)
} else {
@Suppress("DEPRECATION")
return Html.fromHtml(this)
}
}
और फिर यह हर जगह इसका उपयोग करने के लिए बहुत मीठा है:
yourTextView.text = anyString.toSpanned()
Spanned
औरreturn
इस विधि को एपीआई स्तर 24 में
पदावनतकिया गया था ।
आपको FROM_HTML_MODE_LEGACY का उपयोग करना चाहिए
बीच में रिक्त लाइनों (दो न्यूलाइन वर्ण) के साथ ब्लॉक-स्तरीय तत्वों को अलग करें। यह एन से पहले की विरासत व्यवहार है।
कोड
if (Build.VERSION.SDK_INT >= 24)
{
etOBJ.setText(Html.fromHtml("Intellij \n Amiyo",Html.FROM_HTML_MODE_LEGACY));
}
else
{
etOBJ.setText(Html.fromHtml("Intellij \n Amiyo"));
}
कोटलिन के लिए
fun setTextHTML(html: String): Spanned
{
val result: Spanned = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY)
} else {
Html.fromHtml(html)
}
return result
}
कॉल
txt_OBJ.text = setTextHTML("IIT Amiyo")
HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)
आधिकारिक डॉक्टर से:
fromHtml(String)
fromHtml(String, int)
इसके बजाय एपीआई स्तर 24 में विधि को हटा दिया गया था ।
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
के लिए विकल्पtoHtml(Spanned, int)
:'\n'
अंदर<p>
तत्वों द्वारा सीमांकित पाठ की लगातार पंक्तियों को लपेटें ।
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
के लिए विकल्पtoHtml(Spanned, int)
:'\n'
एक<p>
या एक<li>
तत्व के अंदर सीमांकित पाठ की प्रत्येक पंक्ति लपेटें ।
https://developer.android.com/reference/android/text/Html.html
यदि आप कोटलिन का उपयोग कर रहे हैं , तो मैंने कोटलिन एक्सटेंशन का उपयोग करके इसे प्राप्त किया:
fun TextView.htmlText(text: String){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setText(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY))
} else {
setText(Html.fromHtml(text))
}
}
फिर इसे कॉल करें:
textView.htmlText(yourHtmlText)
बस @Rockney और @ k2col से उत्तर का विस्तार करने के लिए बेहतर कोड जैसा दिख सकता है:
@NonNull
public static Spanned fromHtml(@NonNull String html) {
if (CompatUtils.isApiNonLowerThan(VERSION_CODES.N)) {
return Html.fromHtml(html, Html.FROM_HTML_MODE_LEGACY);
} else {
//noinspection deprecation
return Html.fromHtml(html);
}
}
जहां CompatUtils.isApiNonLowerThan
:
public static boolean isApiNonLowerThan(int versionCode) {
return Build.VERSION.SDK_INT >= versionCode;
}
अंतर यह है कि कोई अतिरिक्त स्थानीय चर नहीं हैं और केवल else
शाखा में ही प्रतिनियुक्ति है । तो यह सभी विधि को नहीं बल्कि एकल शाखा को दबाएगा।
यह तब मदद कर सकता है जब Google भविष्य के एंड्रॉइड के कुछ संस्करणों में तय करेगा कि वह fromHtml(String source, int flags)
विधि को भी चित्रित कर सकता है ।
आप उपयोग कर सकते हैं
//noinspection deprecation
return Html.fromHtml(source);
सिर्फ एक बयान के लिए निरीक्षण को दबाने के लिए लेकिन पूरी विधि नहीं।
फ़्रेम क्लास को संशोधित किया गया है ताकि यह सूचित किया जा सके fromHtml()
कि लाइन टूटने की प्रक्रिया को कैसे सूचित किया जाए। यह नौगट में जोड़ा गया था, और केवल एंड्रॉइड के संस्करणों के दौरान इस वर्ग की असंगतियों की चुनौती को छूता है।
मैंने कक्षा के मानकीकरण और बैकपोर्ट के लिए एक संगतता पुस्तकालय प्रकाशित किया है और इसमें तत्वों और स्टाइलिंग के लिए अधिक कॉलबैक शामिल हैं:
हालांकि यह फ्रेमवर्क के एचटीएमएल वर्ग के समान है, अधिक कॉलबैक की अनुमति देने के लिए कुछ हस्ताक्षर परिवर्तनों की आवश्यकता थी। यहाँ 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);
minSdkVersion 15
और targetSdkVersion 23
मुझे मूल्यों के लिए एक बिल्ड त्रुटि मिलती है-v24.xml : Error:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'.
आपका पुस्तकालय एपीआई स्तर 25 को स्पष्ट रूप से लक्षित करता है। अब भी मैं इसका उपयोग कैसे कर सकता हूं?
बस एक समारोह बनाओ:
public Spanned fromHtml(String str){
return Build.VERSION.SDK_INT >= 24 ? Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) : Html.fromHtml(str);
}
उल ओएल ली टैग सहित बुनियादी HTML टैग का समर्थन करने के लिए निम्नलिखित का प्रयास करें। एक टैग हैंडलर बनाएँ जैसा कि नीचे दिखाया गया है
import org.xml.sax.XMLReader;
import android.app.Activity;
import android.os.Bundle;
import android.text.Editable;
import android.text.Html;
import android.text.Html.TagHandler;
import android.util.Log;
public class MyTagHandler implements TagHandler {
boolean first= true;
String parent=null;
int index=1;
@Override
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equals("ul")) parent="ul";
else if(tag.equals("ol")) parent="ol";
if(tag.equals("li")){
if(parent.equals("ul")){
if(first){
output.append("\n\t•");
first= false;
}else{
first = true;
}
}
else{
if(first){
output.append("\n\t"+index+". ");
first= false;
index++;
}else{
first = true;
}
}
}
}
}
नीचे दिखाए अनुसार गतिविधि पर पाठ सेट करें
@SuppressWarnings("deprecation")
public void init(){
try {
TextView help = (TextView) findViewById(R.id.help);
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
help.setText(Html.fromHtml(getString(R.string.help_html),Html.FROM_HTML_MODE_LEGACY, null, new MyTagHandler()));
} else {
help.setText(Html.fromHtml(getString(R.string.help_html), null, new MyTagHandler()));
}
} catch (Exception e) {
e.printStackTrace();
}
}
और संसाधन स्ट्रिंग फ़ाइलों पर HTML पाठ के रूप में
<! [CDATA [... कच्चे HTML डेटा ...]>