私はTextView
の中のhtmlを見るためにHtml.fromHtml
を使っています。
Spanned result = Html.fromHtml(mNews.getTitle());
...
...
mNewsTitle.setText(result);
しかしHtml.fromHtml
はAndroid N +で非推奨になりました
何を/どうすればこれを行うための新しい方法を見つけるのですか?
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
を追加のパラメータに変換できます。これにより、どのフラグを使用するかについて、より細かく制御できます。
私はこれらの警告をたくさん持っていて、私はいつも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)
もしあなたが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()
この方法は
非推奨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")
公式文書より:
fromHtml(String)
メソッドはAPIレベル24で廃止されました。代わりにfromHtml(String, int)
を使用してください。
toHtml(Spanned, int)
のTO_HTML_PARAGRAPH_LINES_CONSECUTIVE
オプション:'\n'
で区切られた連続したテキスト行を<p>
要素で囲みます。
toHtml(Spanned, int)
のTO_HTML_PARAGRAPH_LINES_INDIVIDUAL
オプション:'\n'
で区切られたテキストの各行を<p>
または<li>
要素で囲みます。
https://developer.Android.com/reference/Android/text/Html.html
@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)
メソッドさえも非推奨にすることを決定するとき、それは役に立つことができます。
あなたが使用することができます
//noinspection deprecation
return Html.fromHtml(source);
メソッド全体ではなく、単一のステートメントに対してのみ検査を抑制します。
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)
フレームワーククラスは改行を処理する方法をfromHtml()
に知らせるためのフラグを要求するように修正されました。これはNougatで追加され、Androidのバージョン間でのこのクラスの非互換性の問題にのみ触れています。
クラスを標準化してバックポートし、要素とスタイルのためのコールバックを追加するための互換性ライブラリを公開しました。
フレームワークの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);
これが私の解決策です。
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()));
}