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

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

先看截图:


我们平常使用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. }
效果:


可以看出,字体效果是显示出来了,但是图片却没有显示。要实现图片的显示需要使用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";



THE END

更多相关文章

  1. android的socket程序中conn.getResponseCode() 为405
  2. Android手机拍照
  3. Android中几种图像特效处理的集锦!
  4. Eclipse开发Android常用快捷键
  5. Looper源码探究—Android消息机制
  6. android轮播图组件的制作方法
  7. Android动态壁纸开发
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android外置存储备忘
  2. Android(安卓)安全模型
  3. android 加载图片轻松避免OOM(out of mem
  4. Android面试系列文章2018之Android部分In
  5. Android(安卓)中ContentProvider的实例详
  6. 推荐一个Android的在线课程
  7. android:layout_gravity和gravity的区别
  8. android binder机制之--(创建binder服务)
  9. 我眼中的Android(安卓)IDE
  10. android技术要点梳理