5640人阅读 评论(10) 收藏 举报

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

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

先看截图:

Android TextView使用HTML处理字体样式、显示图片等_第1张图片

我们平常使用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处理字体样式、显示图片等_第2张图片
可以看出,字体效果是显示出来了,但是图片却没有显示。要实现图片的显示需要使用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";

更多相关文章

  1. Android文件系统的提取方法(一)
  2. Android获取webView快照与屏幕截屏的方法
  3. Android测量View宽和高的一般通用方法
  4. 实用Android studio gradle的离线安装方法(官方)
  5. android中退出当前应用程序的四种方法
  6. Android处理大图片

随机推荐

  1. Oracle系统表v$session、v$sql字段说明(转
  2. 项目连接MySQL数据库,提示异常
  3. mysql 中 case when then .... else end
  4. linux下安装2个mysql 失败
  5. MySql生日闰月处理
  6. sql*loader问题,我有几万条记录,为什么只
  7. sql2005指定字段插入空格。
  8. 请问图片存到MySQL服务器中的时候如何操
  9. mysql 全表扫描、全索引扫描、索引覆盖(
  10. docker应用-6(mysql+mycat 搭建数据库集群