最近在项目中有需求使用到了富文本,在android中我们设置TextView显示富文本,如果不涉及图片的话还是比较简单的
TextView tv = new TextView(this);
Spanned spanned = Html.fromHtml(content);
tv.setText(spanned);
但是如果html中有图片的话就会出现以下情况,原本会出现图片的地方出现了空格:
所以需要在填充富文本的时候对图片处理一下,Html中提供了两个方法
Html.fromHtml(String source);
Html.fromHtml(String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler);
其中三参的方法fromHtml可以处理图片的问题,需要匿名内部类实现 ImageGetter,第三个参数可以设置null;
同时因为 ImageGetter 内部类是根据URL来获取网络图片填充富文本的,所以是一个耗时操作,需要放在子线程中实现,而TextView的setTest又是更新UI的操作,所以可以利用Handler,完整代码如下:
private Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
CharSequence charSequence = (CharSequence) msg.obj;
if (charSequence != null) {
hotActivityContent.setText(charSequence);
hotActivityContent.setMovementMethod(LinkMovementMethod.getInstance());
}
break;
default:
break;
}
}
};
private void setActivityContent(final String activityContent) {
new Thread(new Runnable() {
@Override
public void run() {
Html.ImageGetter imageGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable drawable;
drawable = ImageUtils.getInstance().getImageNetwork(source);
if (drawable != null) {
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
} else if (drawable == null) {
return null;
}
return drawable;
}
};
CharSequence charSequence = Html.fromHtml(activityContent.trim(), imageGetter, null);
Message ms = Message.obtain();
ms.what = 1;
ms.obj = charSequence;
mHandler.sendMessage(ms);
}
}).start();
}
/**
* 连接网络获得相对应的图片
* @param imageUrl
* @return
*/
public Drawable getImageNetwork(String imageUrl) {
URL myFileUrl = null;
Drawable drawable = null;
try {
myFileUrl = new URL(imageUrl);
HttpURLConnection conn = (HttpURLConnection) myFileUrl
.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
// 在这一步最好先将图片进行压缩,避免消耗内存过多
Bitmap bitmap = BitmapFactory.decodeStream(is);
drawable = new BitmapDrawable(bitmap);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
return drawable;
}