web-dev-qa-db-ja.com

Html.fromHtmlはAndroid Nでは非推奨です

私はTextViewの中のhtmlを見るためにHtml.fromHtmlを使っています。

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

しかしHtml.fromHtmlはAndroid N +で非推奨になりました

何を/どうすればこれを行うための新しい方法を見つけるのですか?

234
Aldasa

update :@Andyが述べたように、Googleは以下のメソッドの代わりに使用できるHtmlCompatを作成しました。この依存関係implementation 'androidx.core:core:1.0.1をアプリのbuild.gradleファイルに追加します。必ず最新バージョンのandroidx.core:coreを使用してください。

これを使用することができます:

HtmlCompat.fromHtml(HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);

HtmlCompat-documentation のさまざまなフラグについてもっと読むことができます。

元の答え: Android Nでは、彼らは新しいHtml.fromHtmlメソッドを導入しました。 Html.fromHtmlはflagsという名前の追加パラメータを必要とします。このフラグはあなたのHTMLがどのように表示されるかについてあなたにもっとコントロールを与える。

Android N以上では、この新しい方法を使うべきです。古い方法は推奨されておらず、将来のAndroidバージョンでは削除される可能性があります。

古いバージョンでは古いメソッドを、Android N以上では新しいメソッドを使用する独自のUtilメソッドを作成できます。バージョンチェックを追加しないと、あなたのアプリはそれ以前の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クラスのドキュメントのさまざまなフラグについてもっと読むことができます

490
Rockney

私はこれらの警告をたくさん持っていて、私はいつも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);
        }
    }
87
k2col

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 FLAGS

49
Xan

あるいはandroidx.core.text.HtmlCompatを使うこともできます。

HtmlCompat.fromHtml("<b>HTML</b>", HtmlCompat.FROM_HTML_MODE_LEGACY)

HtmlCompatのドキュメント

25
Andy

もしあなたがKotlin上で開発するのに十分幸運であれば、単に拡張関数を作成してください。

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()
24
Leo Droidcoder

fromHtml

この方法は 非推奨 APIレベル24内。

FROM_HTML_MODE_LEGACYを使用してください。

空白行(2つの改行文字)でブロックレベル要素を区切ります。これは、Nより前のレガシ動作です。

コード

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

Kotlinの場合

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")
13
IntelliJ Amiya

公式文書より:

fromHtml(String)メソッドはAPIレベル24で廃止されました。代わりにfromHtml(String, int)を使用してください。

  1. toHtml(Spanned, int)TO_HTML_PARAGRAPH_LINES_CONSECUTIVEオプション:'\n'で区切られた連続したテキスト行を<p>要素で囲みます。

  2. toHtml(Spanned, int)TO_HTML_PARAGRAPH_LINES_INDIVIDUALオプション:'\n'で区切られたテキストの各行を<p>または<li>要素で囲みます。

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

8
USKMobility

@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が将来のAndroidのいくつかのバージョンでfromHtml(String source, int flags)メソッドさえも非推奨にすることを決定するとき、それは役に立つことができます。

5
jakubbialkowski

あなたが使用することができます

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

メソッド全体ではなく、単一のステートメントに対してのみ検査を抑制します。

4

Kotlin を使用している場合は、Kotlin拡張機能を使用してこれを実現しました。

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)
3
David Jarvis

フレームワーククラスは改行を処理する方法をfromHtml()に知らせるためのフラグを要求するように修正されました。これはNougatで追加され、Androidのバージョン間でのこのクラスの非互換性の問題にのみ触れています。

クラスを標準化してバックポートし、要素とスタイルのためのコールバックを追加するための互換性ライブラリを公開しました。

https://github.com/Pixplicity/HtmlCompat

フレームワークのHtmlクラスに似ていますが、コールバックを増やすためにいくつかのシグネチャの変更が必要でした。これが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);
2
Paul Lammertsma

これが私の解決策です。

 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
pavel