Html.fromHtml অ্যান্ড্রয়েড এন এ অবচয়


300

আমি Html.fromHtmlএকটিতে এইচটিএমএল দেখতে ব্যবহার করছি TextView

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

তবে Html.fromHtmlএখন অ্যান্ড্রয়েড এন + এ অবমূল্যায়িত

এটি করার নতুন উপায়টি কীভাবে / আমি খুঁজে পাব?

উত্তর:


616

আপডেট : যেমন @ নীচে উল্লিখিত গুগল তৈরি করেছে HtmlCompatযা নীচের পদ্ধতির পরিবর্তে ব্যবহার করা যেতে পারে। implementation 'androidx.core:core:1.0.1 আপনার অ্যাপ্লিকেশনটির বিল্ড.gradle ফাইলটিতে এই নির্ভরতা যুক্ত করুন। আপনি সর্বশেষতম সংস্করণ ব্যবহার করেছেন তা নিশ্চিত করুন androidx.core:core

এটি আপনাকে ব্যবহার করতে দেয়:

HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);

আপনি এইচটিএমএলকম্প্যাট-ডকুমেন্টেশনের বিভিন্ন পতাকা সম্পর্কে আরও পড়তে পারেন

মূল উত্তর: অ্যান্ড্রয়েড এন এ তারা একটি নতুন Html.fromHtmlপদ্ধতি চালু করেছে । Html.fromHtmlপতাকাগুলির জন্য এখন একটি অতিরিক্ত প্যারামিটার প্রয়োজন। আপনার এইচটিএমএল কীভাবে প্রদর্শিত হয় সে সম্পর্কে এই পতাকা আপনাকে আরও নিয়ন্ত্রণ দেয়।

অ্যান্ড্রয়েড এন এবং তার উপরে আপনার এই নতুন পদ্ধতিটি ব্যবহার করা উচিত। পুরানো পদ্ধতিটি অবহেলা করা হয়েছে এবং ভবিষ্যতের অ্যান্ড্রয়েড সংস্করণগুলিতে সরানো যেতে পারে।

আপনি নিজের ইউটিল-পদ্ধতি তৈরি করতে পারেন যা পুরানো সংস্করণে পুরানো পদ্ধতি এবং অ্যান্ড্রয়েড এন এবং তারপরে আরও নতুন পদ্ধতি ব্যবহার করবে। আপনি যদি কোনও সংস্করণ যোগ না করেন তবে আপনার অ্যাপটি অ্যান্ড্রয়েড সংস্করণে কমবে check আপনি আপনার ইউটিল ক্লাসে এই পদ্ধতিটি ব্যবহার করতে পারেন।

@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অতিরিক্ত প্যারামিটারে রূপান্তর করতে পারেন। এটি কোন পতাকাটি ব্যবহার করবে সে সম্পর্কে এটি আপনাকে আরও নিয়ন্ত্রণ দেয়।

আপনি এইচটিএমএল ক্লাস ডকুমেন্টেশনের বিভিন্ন পতাকা সম্পর্কে আরও পড়তে পারেন


2
শূন্যটি কোন পতাকাটি উপস্থাপন করে?
নিষিদ্ধ-জিওঞ্জিনিয়ারিং


14
আহ, এইচটিএমএলকম্প্যাট মত প্রকাশের জন্য অপেক্ষা করছে
ভ্যানোমার্ট

12
লিন্টের সতর্কতা এড়াতে //noinspection deprecationকেবল একটি মন্তব্য যুক্ত করাও এটি কার্যকর elseuseful
টেড হপ

1
: আপনি তা দেখতে পারেন এই পতাকার প্রতিটি এই ব্লগ পোস্টে না medium.com/@yair.kukielka/...
Yair Kukielka

95

আমার এই প্রচুর সতর্কতা ছিল এবং আমি সর্বদা FROM_HTML_MODE_LEGACY ব্যবহার করি তাই আমি এইচটিএমএলকম্প্যাট নামে একটি সহায়ক শ্রেণি তৈরি করেছি যাতে নিম্নলিখিতটি রয়েছে:

   @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
গৃহীত উত্তরের মতো একই প্রভাব, তবে
সুপারি ওয়ার্নিংস টিকাশনের

আপনি এই মোড সম্পর্কে ছোট ব্যাখ্যা দিতে পারেন?
রঞ্জিত কুমার

আপনি কি সমস্ত এইচটিএমএল কমপ্যাক্ট সরবরাহ করতে পারবেন এটি গিট হাবের কাছে দেখতে দুর্দান্ত
লাগছে

@ শরীফ আমি চাই তবে এটিতে এই একক পদ্ধতিতে এটি কেবলমাত্র বিরক্তিকর ইউটিলিটি ক্লাস ....
2col

61

এইচটিএমএল () এর পতাকাগুলির সাথে তুলনা করুন।

<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 FLAGS


আপনি কি দয়া করে ইনপুট এইচটিএমএল ভাগ করতে পারেন? এটি রূপান্তরকে আরও ভালভাবে বুঝতে সহায়তা করবে।
কল্পনা প্যাটেল

আমি দেখতে পাচ্ছি যে স্টাইলের বৈশিষ্ট্যগুলি প্রয়োগ করা হয়নি, সেগুলি বাস্তবায়নের কোনও উপায় আছে কি?
ক্রিস্টিন


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
মিনামি

14

fromHtml

এই পদ্ধতি ছিল অবচিত মধ্যে এপিআই স্তর 24

আপনার FROM_HTML_MODE_LEGACY ব্যবহার করা উচিত

এর মধ্যে ফাঁকা রেখা (দুটি নতুন লাইন অক্ষর) দিয়ে ব্লক-স্তরীয় উপাদানগুলি পৃথক করুন। এটি এন এর পূর্বে উত্তরাধিকার আচরণ is

কোড

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)
ওয়াজিদ আলী

8

অফিসিয়াল ডক থেকে:

fromHtml(String)পদ্ধতিটি এপিআই স্তরের 24-এ অবমুক্ত করা হয়েছিল fromHtml(String, int) instead পরিবর্তে ব্যবহার করুন।

  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

@ রকনি এবং @ কে 2col এর উত্তরটি প্রসারিত করতে উন্নত কোডটি দেখতে পাবেন:

@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 শাখায় রয়েছে। সুতরাং এটি একক শাখা ছাড়াও সমস্ত পদ্ধতি দমন করবে না।

এটি যখন গুগল অ্যান্ড্রয়েডের ভবিষ্যতের কিছু সংস্করণে এমনকি fromHtml(String source, int flags)পদ্ধতিটিকে হ্রাস করার সিদ্ধান্ত নেবে তখন তা সাহায্য করতে পারে ।


4

তুমি ব্যবহার করতে পার

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

শুধুমাত্র একক বিবৃতিতে পরিদর্শন দমন করতে তবে পুরো পদ্ধতিটি নয়।


2

fromHtml()কীভাবে লাইন ব্রেকগুলি প্রক্রিয়া করতে হবে তা জানাতে একটি পতাকা প্রয়োজন যাতে ফ্রেমওয়ার্ক ক্লাসটি সংশোধন করা হয়েছে । এটি নওগাতে যুক্ত হয়েছিল এবং এটি কেবল অ্যান্ড্রয়েডের সংস্করণ জুড়ে এই শ্রেণীর অসুবিধাগুলির চ্যালেঞ্জকে স্পর্শ করে।

আমি ক্লাসটির মানককরণ এবং ব্যাকপোর্টের জন্য একটি সামঞ্জস্য গ্রন্থাগার প্রকাশ করেছি এবং উপাদান এবং স্টাইলিংয়ের জন্য আরও কলব্যাক অন্তর্ভুক্ত করেছি:

https://github.com/Pixplicity/HtmlCompat

এটি ফ্রেমওয়ার্কের এইচটিএমএল বর্গের মতো হলেও, আরও কলব্যাকের অনুমতি দেওয়ার জন্য কিছু স্বাক্ষর পরিবর্তনগুলি প্রয়োজন। এখানে গিটহাব পৃষ্ঠা থেকে নমুনা দেওয়া হয়েছে:

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 লক্ষ্য করে, স্পষ্টতই। তবুও আমি কীভাবে এটি ব্যবহার করতে পারি?
জেজেডি

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

উল অলি লি ট্যাগ সহ বেসিক এইচটিএমএল ট্যাগগুলিকে সমর্থন করার জন্য নিম্নলিখিত ব্যবহারের চেষ্টা করুন। নীচে প্রদর্শিত হিসাবে একটি ট্যাগ হ্যান্ডলার তৈরি করুন

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

    }

এবং সংস্থান স্ট্রিং ফাইল হিসাবে এইচটিএমএল পাঠ্য

<! [সিডিএটিএ [... কাঁচা এইচটিএমএল ডেটা ...]]>>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.