私は単純なHTMLを持っています:
<h2>Title</h2><br>
<p>description here</p>
HTMLスタイルのテキストをに表示したいTextView
。これを行う方法?
私は単純なHTMLを持っています:
<h2>Title</h2><br>
<p>description here</p>
HTMLスタイルのテキストをに表示したいTextView
。これを行う方法?
回答:
Html.fromHtml()
XML文字列でHTML を使用するには、を使用する必要があります。レイアウトXMLでHTMLを使用して文字列を参照するだけでは機能しません。
これはあなたがすべきことです:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
} else {
textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
}
h2
定義により、それ自体の周りに多くのマージンが作成されます。そしてp
また、ある程度のマージンが付属しています。ギャップが必要ない場合は、他のhtml要素の使用を検討してください。
android.text.Html.fromHtml
。ほとんどのIDEで修正されることはわかっていますが、読みやすくするために、パッケージ名を知っておくと便利です。
setText(Html.fromHtml(bodyData))はAPI 24以降廃止されました。これを行う必要があります:
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
} else {
tvDocument.setText(Html.fromHtml(bodyData));
}
これを見てください:https : //stackoverflow.com/a/8558249/450148
それもかなり良いです!
<resource>
<string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>
一部のタグでのみ機能します。
Javaコードを変更せずにxmlで構成できるようにしたい場合は、このアイデアが役立つことがあります。コンストラクタからinitを呼び出して、テキストをhtmlに設定するだけです
public class HTMLTextView extends TextView {
... constructors calling init...
private void init(){
setText(Html.fromHtml(getText().toString()));
}
}
xml:
<com.package.HTMLTextView
android:text="@string/about_item_1"/>
文字列リソースIDからHTMLを表示しようとしている場合、フォーマットが画面に表示されないことがあります。それが起こっている場合は、代わりにCDATAタグを使用してみてください。
strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>
...
MainActivity.java:
text.setText(Html.fromHtml(getString(R.string.sample_string));
詳細については、この投稿を参照してください。
以下のコードは私にとって最良の結果を与えました。
TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
String value = "<html> <a href=\"http://example.com/\">example.com</a> </html>";
SiteLink= (TextView) findViewById(R.id.textViewSite);
SiteLink.setText(Html.fromHtml(value));
SiteLink.setMovementMethod(LinkMovementMethod.getInstance());
htmlテキストを表示したいだけで本当には必要ない場合はTextView
、a WebView
を取得して次のように使用します。
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
これは、いくつかのhtmlタグにも制限されません。
layout_height="wrap_content"
ます。代わりに、明示的な高さまたはmatch_parentを設定する必要があります。
次のコードスニペットがTextViewにHTMLコンテンツの実際の表示を取得するために、strings.xmlファイルの文字列にCDataセクションを使用する最良の方法は、公平なアイデアを提供します。
//in string.xml file
<string name="welcome_text"><![CDATA[<b>Welcome,</b> to the forthetyroprogrammers blog Logged in as:]]> %1$s.</string>
//and in Java code
String welcomStr=String.format(getString(R.string.welcome_text),username);
tvWelcomeUser.setText(Html.fromHtml(welcomStr));
文字列テキストのCDataセクションは、String.formatメソッドを使用してテキストをフォーマットした後でも、htmlタグデータをそのまま保持します。したがって、Html.fromHtml(str)は正常に機能し、ウェルカムメッセージに太字のテキストが表示されます。
出力:
ようこそ、お気に入りの音楽アプリストアへ。ログイン:ユーザー名
メソッドHtml.fromHtml(String source)はAPIレベル24で廃止されたことに言及する価値があります。それがターゲットAPIである場合は、代わりにHtml.fromHtml(String source、int flags)を使用する必要があります。
また、次のプロジェクトを提案したいと思います:https : //github.com/NightWhistler/HtmlSpanner
使い方はデフォルトのAndroidコンバーターとほとんど同じです。
(new HtmlSpanner()).fromHtml()
標準のHtml.fromHtmlはレンダリングコントロールに対して十分な柔軟性を提供せず、ttfからカスタムフォントを使用する可能性もないため、私がすでにhtml to spannable converterの独自の実装によって開始した後にそれを発見しました
この質問は古いです。他の答えはここに提案Html.fromHtml()
方法があります。使用することをお勧めしますHtmlCompat.fromHtml()
androidx.core.text.HtmlCompat
パッケージします。これは下位互換バージョンのHtml
クラスであるためです。
サンプルコード:
import androidx.core.text.HtmlCompat;
import android.text.Spanned;
import android.widget.TextView;
String htmlString = "<h1>Hello World!</h1>";
Spanned spanned = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT);
TextView tvOutput = (TextView) findViewById(R.id.text_view_id);
tvOutput.setText(spanned);
これにより、Android APIのバージョンチェックを回避でき、使いやすくなります(単線ソリューション)。
次のようなグローバルメソッドを作成します。
public static Spanned stripHtml(String html) {
if (!TextUtils.isEmpty(html)) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT);
} else {
return Html.fromHtml(html);
}
}
return null;
}
次のようにアクティビティ/フラグメントで使用することもできます。
text_view.setText(stripHtml(htmlText));
これをWebビューを使用して実装しました。私の場合、テキストビューのテキストとともにURLから画像をロードする必要がありますが、これは私にとってはうまくいきます。
WebView myWebView =new WebView(_context);
String html = childText;
String mime = "text/html";
String encoding = "utf-8";
myWebView.getSettings().setJavaScriptEnabled(true);
myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);
使用する様々な答えによって示唆されているのHTMLここで提案したようなフレームワークのクラスを、しかし、問題に示されたように、残念ながら、このクラスは、Androidの異なるバージョンの様々な取り組まれていないバグで異なる動作を持つ214637、14778、235128と75953。
したがって、互換性ライブラリを使用して、要素とスタイルのコールバックを含むAndroidバージョン間でHtmlクラスを標準化およびバックポートすることができます。
フレームワークの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);
public class HtmlTextView extends AppCompatTextView {
public HtmlTextView(Context context) {
super(context);
init();
}
private void init(){
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
setText(Html.fromHtml(getText().toString(), Html.FROM_HTML_MODE_COMPACT));
} else {
setText(Html.fromHtml(getText().toString()));
}
}
}
以下のコードを使用してソリューションを取得します。
textView.setText(fromHtml("<Your Html Text>"))
Utitiltyメソッド
public static Spanned fromHtml(String text)
{
Spanned result;
if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
result = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY);
} else {
result = Html.fromHtml(text);
}
return result;
}
ややハックですがまだ天才的な解決策を提案できますか?この記事からアイデアを得て、Androidに適合させました。基本的には、を使用してWebView
、表示および編集するHTMLを編集可能なdivタグに挿入します。このようにして、ユーザーがWebView
キーボードを、キーボードが表示され、編集できるようになります。JavaScriptを追加するだけで、編集済みのHTMLを取り戻すことができます。
これがコードです:
public class HtmlTextEditor extends WebView {
class JsObject {
// This field always keeps the latest edited text
public String text;
@JavascriptInterface
public void textDidChange(String newText) {
text = newText.replace("\n", "");
}
}
private JsObject mJsObject;
public HtmlTextEditor(Context context, AttributeSet attrs) {
super(context, attrs);
getSettings().setJavaScriptEnabled(true);
mJsObject = new JsObject();
addJavascriptInterface(mJsObject, "injectedObject");
setWebViewClient(new WebViewClient(){
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
loadUrl(
"javascript:(function() { " +
" var editor = document.getElementById(\"editor\");" +
" editor.addEventListener(\"input\", function() {" +
" injectedObject.textDidChange(editor.innerHTML);" +
" }, false)" +
"})()");
}
});
}
public void setText(String text) {
if (text == null) { text = ""; }
String editableHtmlTemplate = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta name=\"viewport\" content=\"initial-scale=1.0\" />" + "</head>" + "<body>" + "<div id=\"editor\" contenteditable=\"true\">___REPLACE___</div>" + "</body>" + "</html>";
String editableHtml = editableHtmlTemplate.replace("___REPLACE___", text);
loadData(editableHtml, "text/html; charset=utf-8", "UTF-8");
// Init the text field in case it's read without editing the text before
mJsObject.text = text;
}
public String getText() {
return mJsObject.text;
}
}
そして、ここに要点としてのコンポーネントがあります。
注:元のソリューションからの高さ変更コールバックは必要なかったため、ここにはありませんが、必要に応じて簡単に追加できます。
androidx.
プロジェクトで*クラスを使用する場合は、を使用する必要がありますHtmlCompat.fromHtml(text, flag)
。メソッドのソースは次のとおりです。
@NonNull
public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) {
if (Build.VERSION.SDK_INT >= 24) {
return Html.fromHtml(source, flags);
}
//noinspection deprecation
return Html.fromHtml(source);
}
コードが少なく、1行しかないため、Html.fromHtmlよりも優れた方法であり、推奨される使用方法です。
次のような単純なKotlin拡張関数を使用できます。
fun TextView.setHtmlText(source: String) {
this.text = HtmlCompat.fromHtml(source, HtmlCompat.FROM_HTML_MODE_LEGACY)
}
そして使い方:
textViewMessage.setHtmlText("Message: <b>Hello World</b>")
単に使用してください:
String variable="StackOverflow";
textView.setText(Html.fromHtml("<b>Hello : </b>"+ variable));