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; }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories