在项目中遇到了需要使用TextView展示html文本信息的需求,于是根据网上介绍和官网文档进行了一些探究,这里简单记录下Html.fromHtml()
的一些基本功能。
在Android中Html类提供我们一些方法可以将HTML字符串转变成可显示的样式文本。但并不是所有的HTML标签都支持。
private TextView text;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = ((TextView) findViewById(R.id.text));
String content = "我叫张小龙";
if (Build.VERSION.SDK_INT >= 24)
text.setText(Html.fromHtml(content,Html.FROM_HTML_MODE_COMPACT));
else
text.setText(Html.fromHtml(content));
}
当然我们也可以引用xml中资源,但是我们要通过进行转义:
张小龙
通常情况下我们会遇到文字加图片的形式,Html类中提供了 Html.ImageGetter接口,我们可以利用此方法实现图片的加载,下面分三种情况进行图片的加载:
String content = "我叫张小龙
";
text.setText(Html.fromHtml(content,Html.FROM_HTML_MODE_COMPACT,imageGetter,null));
Html.ImageGetter imageGetter = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
Drawable drawable=null;
drawable=Drawable.createFromPath(source);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable;
};
}
String content = "我叫张小龙
";
text.setText(Html.fromHtml(content,Html.FROM_HTML_MODE_COMPACT,imageGetter,null));
Html.ImageGetter imageGetter = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
Drawable drawable=null;
int rId=Integer.parseInt(source);
drawable=getResources().getDrawable(rId);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
return drawable
};
}
public class MainActivity extends AppCompatActivity {
private TextView text;
//多个图片展示使用Map drawableMap = new HashMap<>()进行存储
private Drawable drawable;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
text = ((TextView) findViewById(R.id.text));
if (Build.VERSION.SDK_INT >= 24)
text.setText(Html.fromHtml(getString(R.string.content),Html.FROM_HTML_MODE_COMPACT,imageGetter,null));
else
text.setText(Html.fromHtml(getString(R.string.content),imageGetter,null));
}
Html.ImageGetter imageGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String s) {
//多张图片情况根据drawableMap.get(s)获取drawable
if (drawable != null)
return drawable;
else
initDrawable(s);
return null;
}
};
/**
* 加载网络图片
* @param s
*/
private void initDrawable(final String s) {
new Thread(new Runnable() {
@Override
public void run() {
try {
final Drawable drawable = Glide.with(MainActivity.this).load(s).submit().get();
runOnUiThread(new Runnable() {
@Override
public void run() {
if (drawable != null) {
drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
//多张图片情况下进行存储:drawableMap.put(s,drawable);
MainActivity.this.drawable = drawable;
if (Build.VERSION.SDK_INT >= 24)
text.setText(Html.fromHtml(getString(R.string.content),Html.FROM_HTML_MODE_COMPACT,imageGetter,null));
else
text.setText(Html.fromHtml(getString(R.string.content),imageGetter,null));
}
}
});
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
}).start();
}
}
关于加载网络图片,很多网上的方法都是在子线程中直接进行drawable的创建,这样会导致Android4.4以上系统不能使用和使用过程中很卡的效果,这里我采用Glide进行图片的加载,并进行二次赋值。如果有多张图片显示,我们可以定义一个Map集合,根据图片的地址来进行存取;图片的地址为key,drawable为value值来进行存储。
在一些特殊场合下使用Html.fromHtml的方法还是比较方便的,关于网络加载图片的方法有兴趣的可以看下源码。使用方法很简单,不懂的或者有更好的方法的小伙伴欢迎留言探讨。哈哈!