Html.fromHtmlはAndroid Nで廃止予定


300

Html.fromHtmlHTMLを表示するために使用していますTextView

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

しかしHtml.fromHtml、現在Android N +では非推奨です

これを行う新しい方法は何ですか?

回答:


616

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

これにより、以下を使用できます。

HtmlCompat.fromHtml(html, HtmlCompat.FROM_HTML_MODE_LEGACY);

さまざまなフラグの詳細については、HtmlCompat-documentationをご覧ください。

元の回答: Android Nでは、新しいHtml.fromHtml方法が導入されました。Html.fromHtmlフラグという名前の追加パラメーターが必要になりました。このフラグにより​​、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クラスのドキュメントをご覧ください。


2
ゼロはどのフラグを表していますか?
ban-geoengineering

4
Html.FROM_HTML_MODE_LEGACY
ban-geoengineering

14
ああ、HtmlCompatのようなものが現れるのを待っています
vanomart

12
lint警告を回避するために、//noinspection deprecationコメントをのすぐ下に追加することも役立ちelseます。
テッドホップ

1
これらの各フラグの機能は、このブログ投稿で確認できます。medium.com
Yair Kukielka '25

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
受け入れられた回答と同じ効果ですが、SuppressWarningsアノテーションにより+1
Stoycho Andreev

このモードについて少し説明してもらえますか?
Ranjith Kumar

すべてのHtmlCompactをgitハブに配置して提供できますか?クールに見える
shareef '12 / 07/12

@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も共有できますか?これは変換をよりよく理解するのに役立ちます。
Kalpesh Patel

スタイル属性が実装されていないようですが、それらを実装する方法はありますか?
クリスティーヌ


25

幸運にも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()

5
あなたは、removeでタイピングを保存することSpannedreturn

14

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

このモードについて少し説明してもらえますか?
Ranjith Kumar

あなたはSDKがバージョンチェックを処理したい場合は、使用: HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)
Wajidアリ

8

公式ドキュメントから:

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

  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

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)

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がAndroidの将来のバージョンでfromHtml(String source, int flags)メソッドを廃止することを決定するときに役立ちます。


4

使用できます

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

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


2

フレームワーククラスが変更され、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);

私はその用途のアプリで、あなたのライブラリーを使用する場合minSdkVersion 15targetSdkVersion 23、私はのためのビルドエラーを取得値-v24.xmlError:(3) Error retrieving parent for item: No resource found that matches the given name 'android:TextAppearance.Material.Widget.Button.Borderless.Colored'.明らかに、あなたのライブラリーのターゲットのAPIレベル25を。どうすれば使用できますか?
JJD 2017年

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

ul ol liタグを含む基本的な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データ...]]>

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.