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


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

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

    先看截图:

                   

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

    [java] view plaincopy
    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 plaincopy
    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 plaincopy
    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.     }  
    效果:

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

    [java] view plaincopy
    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 plaincopy
    1. <uses-permission android:name="android.permission.INTERNET" />  

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


    [java] view plaincopy
    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 plaincopy
    1. String source;  
    2. source=getFilesDir()+"/ic_launcher.png";  



    THE END

  • 相关阅读:
    iOS开发笔记--Layer 图层圆角、边框 、底纹其他常用操作
    tableView中deselectRowAtIndexPath的作用
    升级到XCode6后,iOS8里设置tableview的setSeparatorInset:UIEdgeInsetsZero不起作用的解决办法
    UITableView代理和数据源方法总结
    ios修改textField的placeholder的字体颜色、大小
    iOS-TextField知多少
    iOS开发SVN更新代码不报错却运行不了问题
    apache http server 局域网无法访问
    修改 apache http server 默认站点目录
    批处理 教程(转载)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6469697.html
Copyright © 2020-2023  润新知