Html.fromHtml को Android N में दर्शाया गया है


300

मैं Html.fromHtmlएक में HTML देखने के लिए उपयोग कर रहा हूँ TextView

Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);

लेकिन Html.fromHtmlअब Android N + में अपग्रेड किया गया है

मुझे यह करने का नया तरीका क्या / कैसे मिलेगा?

जवाबों:


616

अद्यतन : जैसा कि @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 वर्ग प्रलेखन पर विभिन्न झंडे के बारे में अधिक पढ़ सकते हैं


2
शून्य किस ध्वज का प्रतिनिधित्व करता है?
प्रतिबंध-जियोइंजीनियरिंग


14
आह, HtmlCompat जैसे दिखने के लिए कुछ इंतजार कर रहा है
vanomart

12
यह भी एक चेतावनी जोड़ने के लिए उपयोगी है लिंट चेतावनी से बचने //noinspection deprecationके elseलिए।
टेड होप

1
आप इस ब्लॉग पोस्ट में इनमें से प्रत्येक झंडे को क्या देख सकते हैं: medium.com/@yair.kukielka/…
यैर कुकिल्का

95

मेरे पास इन चेतावनियों का एक बहुत कुछ था और मैं हमेशा 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);
        }
    }

2
एक ही प्रभाव स्वीकार किए जाते हैं उत्तर की तरह है, लेकिन +1 की वजह से दबाए गए एनोटेशन
स्टोचो एंड्रीव

क्या आप इस विधा के बारे में कुछ स्पष्टीकरण दे सकते हैं?
रंजीथ कुमार

आप सभी HtmlCompact प्रदान कर सकते हैं git हब पर यह अच्छा लग सकता है
shareef

@shareef मैं, लेकिन यह वास्तव में इस एकल विधि के साथ सिर्फ एक उबाऊ उपयोगिता वर्ग है ....
k2col

61

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

FROM_HTML फ़्लैग्स


क्या आप कृपया इनपुट HTML भी साझा कर सकते हैं? इससे रूपांतरण को बेहतर ढंग से समझने में मदद मिलेगी।
कल्पेश पटेल

मैं देख रहा हूं कि शैली विशेषताओं को लागू नहीं किया गया है, क्या उन्हें लागू करने का कोई तरीका है?
क्रिस्टीन


25

यदि आप कोटलिन पर विकसित करने के लिए पर्याप्त भाग्यशाली हैं, तो एक एक्सटेंशन फ़ंक्शन बनाएं:

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

5
आप हटाकर टाइपिंग को बचा सकते हैं Spannedऔरreturn
Minami

14

fromHtml

इस विधि को एपीआई स्तर 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")

क्या आप इस विधा के बारे में कुछ स्पष्टीकरण दे सकते हैं?
रंजीथ कुमार

यदि आप चाहते हैं कि SDK संस्करण की जाँच करें, तो उपयोग करें: HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)
वाजिद अली

8

आधिकारिक डॉक्टर से:

fromHtml(String)fromHtml(String, int) इसके बजाय एपीआई स्तर 24 में विधि को हटा दिया गया था ।

  1. TO_HTML_PARAGRAPH_LINES_CONSECUTIVEके लिए विकल्प toHtml(Spanned, int): '\n'अंदर <p> तत्वों द्वारा सीमांकित पाठ की लगातार पंक्तियों को लपेटें ।

  2. TO_HTML_PARAGRAPH_LINES_INDIVIDUALके लिए विकल्प toHtml(Spanned, int): '\n'एक <p>या एक <li> तत्व के अंदर सीमांकित पाठ की प्रत्येक पंक्ति लपेटें ।

https://developer.android.com/reference/android/text/Html.html


8

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

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)

5

बस @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)विधि को भी चित्रित कर सकता है ।


4

आप उपयोग कर सकते हैं

//noinspection deprecation
return Html.fromHtml(source);

सिर्फ एक बयान के लिए निरीक्षण को दबाने के लिए लेकिन पूरी विधि नहीं।


2

फ़्रेम क्लास को संशोधित किया गया है ताकि यह सूचित किया जा सके fromHtml()कि लाइन टूटने की प्रक्रिया को कैसे सूचित किया जाए। यह नौगट में जोड़ा गया था, और केवल एंड्रॉइड के संस्करणों के दौरान इस वर्ग की असंगतियों की चुनौती को छूता है।

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

https://github.com/Pixplicity/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);

जब मैं आपकी लाइब्रेरी का उपयोग एक ऐप पर करता हूं जो उपयोग करता है 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 को स्पष्ट रूप से लक्षित करता है। अब भी मैं इसका उपयोग कैसे कर सकता हूं?
JJD

2

यहाँ मेरा समाधान है।

 if (Build.VERSION.SDK_INT >= 24) {
        holder.notificationTitle.setText(Html.fromHtml(notificationSucces.getMessage(), Html.FROM_HTML_MODE_LEGACY));
    } else {
        holder.notificationTitle.setText(Html.fromHtml(notificationSucces.getMessage()));

    }

1

बस एक समारोह बनाओ:

public Spanned fromHtml(String str){
  return Build.VERSION.SDK_INT >= 24 ? Html.fromHtml(str, Html.FROM_HTML_MODE_LEGACY) : Html.fromHtml(str);
}

-2

उल ओएल ली टैग सहित बुनियादी 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 डेटा ...]>

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