我有简单的HTML:
<h2>Title</h2><br>
<p>description here</p>
我想在中显示HTML样式的文本TextView
。这个怎么做?
我有简单的HTML:
<h2>Title</h2><br>
<p>description here</p>
我想在中显示HTML样式的文本TextView
。这个怎么做?
Answers:
您需要使用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>
它仅适用于少量标签。
如果您希望能够通过xml对其进行配置而无需在Java代码中进行任何修改,那么您可能会发现此想法很有帮助。只需从构造函数调用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"/>
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文本,而实际上并不需要a TextView
,请WebView
使用a 并按如下所示使用它:
String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
这也不限制您使用几个html标记。
layout_height="wrap_content"
。您将必须设置一个明确的高度或match_parent。
在string.xml文件中的字符串中使用CData部分以将html内容实际显示到TextView的最佳方法是,以下代码片段将带给您一个不错的主意。
//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));
即使在使用String.format方法格式化文本之后,字符串文本中的CData部分仍可保持html标记数据的完整性。因此,Html.fromHtml(str)可以正常工作,并且您会在“欢迎”消息中看到粗体文本。
输出:
欢迎来到您最喜欢的音乐应用商店。登录为:用户名
值得一提的是,从API级别24开始不推荐使用Html.fromHtml(String source)。如果这是您的目标API,则应改用Html.fromHtml(String source,int flags)。
我也想建议以下项目:https : //github.com/NightWhistler/HtmlSpanner
用法与默认的android转换器几乎相同:
(new HtmlSpanner()).fromHtml()
在我已经开始通过自己的html到spannable转换器的实现开始后找到了它,因为标准Html.fromHtml在渲染控制方面没有提供足够的灵活性,甚至无法使用ttf的自定义字体
我知道这个问题很旧。其他答案在这里建议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版本,并且易于使用(单行解决方案)。
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
制作一个像下面这样的全局方法:
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版本和各种未解决的bug不同的行为,如表现在问题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>"))
效用法
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);
}
它比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));