今天做的项目要求后台录入html格式的图文并茂的信息,移动端对应要显示html格式的信息。由于需要做wrap_content的展示,放弃使用webview,采用TextView显示。最终效果感觉好于webview。风格比较统一。唯一不太好的是图片的位置好像是靠左,webview是居中。但只要内容不算很复杂,用textview还是可以的。
一开始我发现就算是copy paste前人的代码,显示的内容怎么都是<span xxx>text</span><b>...之类的,一直以为是自己写错了。后来发现后台发过来的代码有encode..就是"<"变成了<。 于是就做了两次转换:
Html.fromHtml(Html.fromHtml(text).toString(),imgGetter,null );
这样解决了第一个问题。
第二个要注意的是要把带imageGetter的方法放到非主线程中,因为图片下载不能在主线程里面。
第三个要注意的是非主线程里不能调用textView.setText(text);如果用task就在activity里做回调,如果用thread可以用个handler.sendMessage把结果返回。
另外,如果用webview.loadData()也可以,但有可能遇到中文乱码的情况,正确写法如下:
webView.loadData(html,"text/html; charset=UTF-8", null);
当然,如果字符串是encode过了的,还是要再转一次,如下:
webView.loadData(Html.fromHtml(html).toString(),"text/html; charset=UTF-8", null);
好了,下面就是copy/paste时间了,部分关键代码如下,:
imgGetter = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
InputStream is = null;
try {
if(isFinishing()){
return null;
}
is = (InputStream) new URL(source).getContent();
Drawable d = Drawable.createFromStream(is, "src");
d.setBounds(0, 0, d.getIntrinsicWidth(),
d.getIntrinsicHeight());
is.close();
return d;
} catch (Exception e) {
return null;
}
}
};
loadContentThread=new Thread(new Runnable() {
@Override
public void run() {
String parsedHtml = Html.fromHtml(textOriginal).toString();
Spanned text =Html.fromHtml(parsedHtml,imgGetter,null );
Message msg = new Message();
msg.what=CONTENT_LOAD_FINISH;
Bundle bundle = new Bundle();
bundle.putCharSequence("content",text);
msg.setData(bundle);
mHandle.sendMessage(msg);
}
});
loadContentThread.start();
private Handler mHandle=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg.what ==CONTENT_LOAD_FINISH){
Spanned content = (Spanned)msg.getData().getCharSequence("content");
mContentView.setText(content);
}
}
};
欢迎多多指正 ^_^ 尽请留言。