学Android的时候突然想到一个问题:怎么用TextView控件显示带有格式的文字,可否使用Html布局?查了下Android 帮助文档,其提供了android.text.Html类和Html.ImageGetter、Html.TagHandler接口

其实本不打算写这篇博文的,但看到网络上关于此的文章,基本是:你抄我,我抄你,大家抄来抄去,有用的也就那么一两篇文章,而且说得不明不白,网络就是如 此,盗版也成为了一种文化,这就是所谓的拿来主义吧。当然不否认大牛的辛勤劳作,写出的高质量文章;其次是学以致用,个人习惯--总结一下。

先看截图:

[转] Android TextView处理HTML标签、显示图片等

我们平常使用TextView的setText()方法传递String参数的时候其实是调用的public final void setText (CharSequence text)方法:

[java] view plain copy
  1. /**
  2. *SetsthestringvalueoftheTextView.TextView<em>doesnot</em>accept
  3. *HTML-likeformatting,whichyoucandowithtextstringsinXMLresourcefiles.
  4. *Tostyleyourstrings,attachandroid.text.style.*objectstoa
  5. *{@linkandroid.text.SpannableStringSpannableString},orseethe
  6. *<ahref="{@docRoot}guide/topics/resources/available-resources.html#stringresources">
  7. *AvailableResourceTypes</a>documentationforanexampleofsetting
  8. *formattedtextintheXMLresourcefile.
  9. *
  10. *@attrrefandroid.R.styleable#TextView_text
  11. */
  12. @android.view.RemotableViewMethod
  13. publicfinalvoidsetText(CharSequencetext){
  14. setText(text,mBufferType);
  15. }

而String类是CharSequence的子类,在CharSequence子类中有一个接口Spanned,即类似html的带标记的文本,我们可以用它来在TextView中显示html。在上面Android源码注释中有提及TextView does not accept HTML-like formatting。

android.text.Html类共提供了三个方法,可以到Android帮助文档查看。

[java] view plain copy
  1. publicstaticSpannedfromHtml(Stringsource)
  2. publicstaticSpannedfromHtml(Stringsource,Html.ImageGetterimageGetter,Html.TagHandlertagHandler)
  3. publicstaticStringtoHtml(Spannedtext)

通过使用第一个方法,可以将Html显示在TextView中:

[java] view plain copy
  1. publicvoidonCreate(BundlesavedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.main);
  4. TextViewtv=(TextView)findViewById(R.id.textView1);
  5. Stringhtml="<html><head><title>TextView 使用HTML</title></head><body><p><strong>强 调</strong></p><p><em>斜体</em></p>"
  6. +"<p><ahref=\"http://www.dreamdu.com /xhtml/\">超链接HTML入门</a>学习HTML!< /p><p><fontcolor=\"#aabb00\">颜色1"
  7. +"</p><p><fontcolor=\"#00bbaa \">颜色2</p><h1>标题1</h1><h3>标题2< /h3><h6>标题3</h6><p>大于>小于<</p><p>"+
  8. "下面是网络图片</p><imgsrc=\"http://avatar.csdn.net/0/3/8/2_zhang957411207.jpg\"/></body></html>";
  9. tv.setMovementMethod(ScrollingMovementMethod.getInstance());//滚动
  10. tv.setText(Html.fromHtml(html));
  11. }

效果:

[转] Android TextView处理HTML标签、显示图片等
可以看出,字体效果是显示出来了,但是图片却没有显示。要实现图片的显示需要使用Html.fromHtml的另外一个重构方法:public static Spanned fromHtml (String source, Html.ImageGetterimageGetter, Html.TagHandler tagHandler)其中Html.ImageGetter是一个接口,我们要实现此接口,在它的getDrawable(String source)方法中返回图片的Drawable对象才可以。
修改后的代码:

[java] view plain copy
  1. ImageGetterimgGetter=newHtml.ImageGetter(){
  2. publicDrawablegetDrawable(Stringsource){
  3. Drawabledrawable=null;
  4. URLurl;
  5. try{
  6. url=newURL(source);
  7. drawable=Drawable.createFromStream(url.openStream(),"");//获取网路图片
  8. }catch(Exceptione){
  9. returnnull;
  10. }
  11. drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable
  12. .getIntrinsicHeight());
  13. returndrawable;
  14. }
  15. };


这里主要是实现了Html.ImageGetter接口,通过图片的URL地址获取相应的Drawable实例。
不要忘了在Mainifest文件中加入网络访问的权限:

[java] view plain copy
  1. <uses-permissionandroid:name="android.permission.INTERNET"/>


友情提示:通过网络获取图片是一个耗时的操作,最好不要放在主线程中,否则容易引起阻塞。
上面介绍的是显示网络上的图片,但如何显示本地的图片呢:

[java] view plain copy
  1. ImageGetterimgGetter=newHtml.ImageGetter(){
  2. publicDrawablegetDrawable(Stringsource){
  3. Drawabledrawable=null;
  4. drawable=Drawable.createFromPath(source);//显示本地图片
  5. drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable
  6. .getIntrinsicHeight());
  7. returndrawable;
  8. }
  9. };

只需将source改为本地图片的路径便可,在这里我使用的是:

[java] view plain copy
  1. Stringsource;
  2. source=getFilesDir()+"/ic_launcher.png";

From: http://blog.csdn.net/johnsonblog/article/details/7741972

附:

超链接的另一种识别方式:

String html="www.baidu.com";//这里即使不加协议号HTTP;也能自动被系统识别出来。textView.setText(html);textView.setAutoLinkMask(Linkify.ALL);textView.setMovementMethod(LinkMovementMethod.getInstance()); 

这两种方法,都得设置一下setMovementMethod,才会跳转。
另外setAutoLinkMask不仅 识别超链接,包括电话号码之类的。

详细出处参考:http://www.jb51.net/article/38160.htm

更多相关文章

  1. AIDL --- Android中的远程接口(1)
  2. 2014-11-8Android学习------Android 实现图片的旋转--------动画
  3. Android ADB使用方法
  4. Android之Adapter:连接后端数据和前端显示的适配器接口
  5. Handle详解和使用方法
  6. android中使用线程池和临时缓存优化网络图片加载
  7. Android下引用系统库的方法及问题
  8. Android Nine Patch图片及按钮背景

随机推荐

  1. 【Linux】apt软件管理和远程登录
  2. wordpress网站安全防护办法
  3. 网站漏洞挖掘与安全渗透测试
  4. 意派Epub360丨妇女节投票类H5怎么做?示范
  5. php curl返回错误码60如何解决
  6. php判断数组元素不为空格实例代码
  7. PHP创建简单RPC服务案例详解
  8. php一句话木马变形技巧
  9. php array_walk array_map array_filter
  10. 开发提效小技巧分享(一)