前言
在一些需求富文本显示或者编辑的开发情况下,数据都是用html的格式来保存文本信息的.而google是有提供解析html的工具类那就是Html.有了Html可以让TextView也支持富文本(其实原理还是解析Html然后在转成SpannableString再给TextView显示)
显示Html格式文本
String htmlContent = "<p><font size="3" color="red">先帝创业未半而中道崩殂</font></p>" +
"<b><font size="5" color="blue">今天下三分</font></font></b></br>" +
"<h1>益州疲弊,此诚危急存亡之秋也</h1></br>";
mTextView.setText(Html.fromHtml(htmlContent));
htmlContent是一段html的格式内容的文本,而让TextView显示富文本内容只需要轻松的调用Html.fromHtml(htmlContent)即可. 而Html.fromHtml则是将html转成了Spanned
另外注意!html格式里的"引号需要按照java的格式添加斜杠
效果图:
显示带图片地址的Html
final String htmlContent = "<p><font size="3" color="red">先帝创业未半而中道崩殂</font></p>" + "<b><font size="5" color="blue">今天下三分</font></font></b></br>" + "<h1>益州疲弊,此诚危急存亡之秋也</h1></br>" + "</p><img src="http://n.sinaimg.cn/sinacn/w450h212/20171223/16c3-fypvuqf3150782.jpg""; new Thread(new Runnable() { //从网络中下载图片是耗时操作,所以需要使用线程.还有mSpanned = Html.fromHtml()的创建其实也是异步耗时的. @Override public void run() { mSpanned = Html.fromHtml(htmlContent, new Html.ImageGetter() { @Override public Drawable getDrawable(String source) { Drawable drawable = null; try { drawable = Drawable.createFromStream(new URL(source).openStream(), "image.jpg");//下载图片 drawable.setBounds(0, 0, 200, 200);//设置图片显示范围 } catch (IOException e) { e.printStackTrace(); } return drawable; } }, null); runOnUiThread(new Runnable() { //切换到主线程设置内容 @Override public void run() { mTextView.setText(mSpanned); } }); } }).start();
效果图:
SpannableString转成Html格式文本
能正着转,那么当然能反着转.下面我们来演示SpannableString转成Html格式文本
String content = "先帝创业未半而中道崩殂 今天下三分益州疲弊, 此诚危急存亡之秋也"; SpannableString spannableString = new SpannableString(content); spannableString.setSpan(new ForegroundColorSpan(Color.RED) , content.indexOf("先帝") , content.indexOf(" 今") , Spanned.SPAN_INCLUSIVE_EXCLUSIVE); spannableString.setSpan(new StyleSpan(Typeface.BOLD) , content.indexOf("殂 ") , content.indexOf("此诚") , Spanned.SPAN_INCLUSIVE_EXCLUSIVE); Log.e(TAG, "SpannableString转成html:"+Html.toHtml(spannableString));
结果:
2019-07-23 14:36:53.271 11620-11620/demo.yt.com.demo E/demo.yt.com.demo.MainActivity: SpannableString转成html:<p dir="ltr"><span style="color:#FF0000;">先帝创业未半而中道崩</span><span style="color:#FF0000;"><b>殂</b></span><br> <b>今天下三分益州疲弊,</b><br> 此诚危急存亡之秋也</p>
中文部分也被转成了unicode编码,不过不用担心,直接给TextView 是可以正常显示中文的.
舍弃Html格式,提取文本内容
SpannableString直接提取文本(UTF-8格式)
Spanned spanned = Html.fromHtml(htmlContent);//htmlContent是String类型的html文本 SpannableString spannableString = new SpannableString(spanned); holder.itemText.setText(spannableString.toString());
推荐使用这种方式,直接utf-8无需转换.
SpannableString用Html类提取文本内容(会变成unicode格式编码,此方法及供参考)
String content = "先帝创业未半而中道崩殂 今天下三分益州疲弊, 此诚危急存亡之秋也"; SpannableString spannableString = new SpannableString(content); spannableString.setSpan(new ForegroundColorSpan(Color.RED) , content.indexOf("先帝") , content.indexOf(" 今") , Spanned.SPAN_INCLUSIVE_EXCLUSIVE); spannableString.setSpan(new StyleSpan(Typeface.BOLD) , content.indexOf("殂 ") , content.indexOf("此诚") , Spanned.SPAN_INCLUSIVE_EXCLUSIVE); Log.e(TAG, "提取文本:"+Html.escapeHtml(spannableString));
结果:
2019-07-23 14:38:56.132 11753-11753/demo.yt.com.demo E/demo.yt.com.demo.MainActivity: 提取文本:先帝创业未半而中道崩殂 今天下三分益州疲弊, 此诚危急存亡之秋也
一样中文部分也被转成了unicode编码.
Html里提取内容文本内容(会变成unicode格式编码,此方法及供参考)
String htmlContent = "<p><font size="3" color="red">先帝创业未半而中道崩殂</font></p>" + "<b><font size="5" color="blue">今天下三分</font></font></b></br>" + "<h1>益州疲弊,此诚危急存亡之秋也</h1></br>"; Spanned spanned = Html.fromHtml(htmlContent); Log.e(TAG, "提取文本:"+Html.escapeHtml(spanned));
结果也是跟上面一样
END