您的位置:首页 > 理论基础 > 计算机网络

TextView中html字符串(带网络图片处理)

2016-07-11 23:38 344 查看

TextView中html字符串(带网络图片处理)

附:向html数据中添加标签方法

Android中不仅有可以通过WebView.loadData()的方式加载html样式字符串数据,同时还可以通过TextView来处理。虽然有时WebView可以满足大部分的需求,但是有时部分需求并不能完美解决,这时TextView就成了可以想到的另一种方式。

TextView来展示html样式数据主要通过Html.fromHtml(String html)这个方法将html类型的字符串转换成TextView需要的类型。

For example:

public final String MSG_WHAT = 0x13;

//处理有网络图片的标签的数据,并且加到TextView中
public void htmlWebPic(final String htmlContent) {
//开启一个线程来加载网络图片
Thread t = new Thread(new Runnable() {
Message msg = handler.obtainMessage();

@Override
public void run() {
//需要使用来加载htmlContent数据中的<img>标签数据
Html.ImageGetter imageGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
URL url = null;
Drawable drawable = null;
try {
url = new URL(source);
drawable = Drawable.createFromStream(
url.openStream(), null);
/**需求根据屏幕宽度和图片比例来设置图片宽高*/
//获取屏幕宽度
int width = Utils.getInstance().getWidth(CustomerQuestionActivity.this);
//计算获得响应图片的高度
int height = width *
drawable.getIntrinsicHeight() / drawable.getIntrinsicWidth();
drawable.setBounds(0, 0,
width,
height);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return drawable;
}
};
CharSequence result = Html.fromHtml(htmlContent, imageGetter, null);
msg.what = MSG_WHAT;
msg.obj = result;
handler.sendMessage(msg);
}
});
t.start();
}

//处理加载完图片的html数据
private Handler handler = new Handler(new Handler.Callback() {
public boolean handleMessage(Message msg) {
if (msg.what == MSG_WHAT) {
//加载完数据(包括图片)时,通过handler调用
customerquestion_tv.setText((CharSequence) msg.obj);
}
return false;
}
});


可以通过以上的操作来完成不需要修改html数据时加载相关数据的操作,但是有时需求是需要把html数据中单独图片来适应屏幕的宽度,可是有时屏幕的分辨率很大, 而且<img>标签前面字符较少,这时可能就会出现,前面文字在前面,但是后面的图片会跟前面的文字同排,不仅不美观并且还不符合需求,这时就需要我们自己向html数据中添加标签,具体方法如下:

注:这只是添加一种标签的方式,如果需要添加多种标签,请多次调用。

/**
* 给相应的html数据中的<img>标签添加段落标签。
* @param startLable 开始标签的  eg: <img
* @param endLable  标签结束标志 eg: /img>
* @param addStartLable 需要添加的开始的标签
* @param addEndLable 需要添加的结束的标签
* @param htmlContent html数据
* @return
*/
public String addLable(String startLable,String endLable,String addStartLable,String addEndLable,String htmlContent) {
boolean isContinue = true;
StringBuffer stringBuffer = new StringBuffer();
while (isContinue){
if (htmlContent.indexOf(startLable) != -1){
String newString = htmlContent;
stringBuffer.append(newString.substring(0,htmlContent.indexOf(startLable)) + addStartLable +startLable);
htmlContent = htmlContent.substring(htmlContent.indexOf(startLable) + startLable.length());
if (htmlContent.indexOf(endLable) != -1 && isLeft(htmlContent,endLable)){
newString = htmlContent;
stringBuffer.append(newString.substring(0,htmlContent.indexOf(endLable)) + endLable+ addEndLable);
htmlContent = htmlContent.substring(htmlContent.indexOf(endLable) + endLable.length());
}else if (htmlContent.indexOf("/>") != -1){
newString = htmlContent;
stringBuffer.append(newString.substring(0,htmlContent.indexOf("/>")) + "/>" + addEndLable);
htmlContent = htmlContent.substring(htmlContent.indexOf("/>") + 2);
}
}else {
isContinue = false;
}
}
return stringBuffer.toString();
}

/**
* 判断Html标签‘/>’ 是否在 相关标签的的左侧
* @param htmlContent html数据内容
* @param endLable 相关结束标签
* @return
*/
public boolean isLeft(String htmlContent,String endLable){
if (htmlContent.indexOf("/>") != -1){
return htmlContent.indexOf(endLable) < htmlContent.indexOf("/>");
}
return true;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android