富文字在TextView中顯示圖片
阿新 • • 發佈:2018-11-20
最近在專案中有需求使用到了富文字,在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;
}