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

学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.     * Sets the string value of the TextView. TextView <em>does not</em> accept 
  3.     * HTML-like formatting, which you can do with text strings in XML resource files. 
  4.     * To style your strings, attach android.text.style.* objects to a 
  5.     * {@link android.text.SpannableString SpannableString}, or see the 
  6.     * <a href="{@docRoot}guide/topics/resources/available-resources.html#stringresources"> 
  7.     * Available Resource Types</a> documentation for an example of setting  
  8.     * formatted text in the XML resource file. 
  9.     * 
  10.     * @attr ref android.R.styleable#TextView_text 
  11.     */  
  12.    @android .view.RemotableViewMethod  
  13.    public final void setText(CharSequence text) {  
  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. public static Spanned fromHtml (String source)  
  2.   
  3. public static Spanned fromHtml (String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)  
  4.   
  5. public static String toHtml (Spanned text)  


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

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

              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. ImageGetter imgGetter = new Html.ImageGetter() {  
  2.         public Drawable getDrawable(String source) {  
  3.               Drawable drawable = null;  
  4.               URL url;    
  5.               try {     
  6.                   url = new URL(source);    
  7.                   drawable = Drawable.createFromStream(url.openStream(), "");  //获取网路图片  
  8.               } catch (Exception e) {    
  9.                   return null;    
  10.               }    
  11.               drawable.setBounds(00, drawable.getIntrinsicWidth(), drawable  
  12.                             .getIntrinsicHeight());  
  13.               return drawable;   
  14.         }  
  15. };  

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

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

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


[java]   view plain copy
 
  1.    ImageGetter imgGetter = new Html.ImageGetter() {  
  2.         public Drawable getDrawable(String source) {  
  3.               Drawable drawable = null;  
  4.                  
  5.               drawable = Drawable.createFromPath(source); //显示本地图片  
  6.               drawable.setBounds(00, drawable.getIntrinsicWidth(), drawable  
  7.                             .getIntrinsicHeight());  
  8.               return drawable;   
  9.         }  
  10. };  
只需将source改为本地图片的路径便可,在这里我使用的是:
[java]   view plain copy
 
  1. String source;  
  2. source=getFilesDir()+"/ic_launcher.png";  

你可能感兴趣的:(Android TextView使用HTML处理字体样式、显示图片等)