回答:
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クラスのドキュメントをご覧ください。
Html.FROM_HTML_MODE_LEGACY
//noinspection deprecation
コメントをのすぐ下に追加することも役立ちelse
ます。
これらの警告がたくさんあり、常に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()
Spanned
とreturn
このメソッドは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")
HtmlCompat.fromHtml("textWithHtmlTags", HtmlCompat.FROM_HTML_MODE_LEGACY)
公式ドキュメントから:
fromHtml(String)
メソッドはAPIレベル24で廃止されましたfromHtml(String, int)
。代わりに使用してください。
TO_HTML_PARAGRAPH_LINES_CONSECUTIVE
オプションtoHtml(Spanned, int)
:'\n'
内部<p>
要素で区切られたテキストの連続する行を折り返します。
TO_HTML_PARAGRAPH_LINES_INDIVIDUAL
オプションtoHtml(Spanned, int)
:または 要素'\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)
メソッドを廃止することを決定するときに役立ちます。
フレームワーククラスが変更され、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);
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'.
明らかに、あなたのライブラリーのターゲットのAPIレベル25を。どうすれば使用できますか?
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データ...]]>