TextView使用HTML标签

关于TextView 的富文本实现方式,有2中,一种使用Html来做,一种是使用SpannableString;

SpannableString太麻烦了,这里有参考:

http://www.chawenti.com/articles/16016.html

关于 TextView使用Html,可以参考 这篇blog

http://blog.csdn.net/johnsonblog/article/details/7741972#comments

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

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

public static Spanned fromHtml (String source)
public static Spanned fromHtml (String source, Html.ImageGetter imageGetter, Html.TagHandler tagHandler)
public static String toHtml (Spanned text)

经常使用的是第一个方法:

       TextView tv=(TextView)findViewById(R.id.textView1);  
        String html="<html><head><title>TextView
使用HTML</title></head><body><p><strong>强
调</strong></p><p><em>斜体</em></p>"  
                +"<p><a href=\"http://www.dreamdu.com
/xhtml/\">超链接HTML入门</a>学习HTML!<
/p><p><font color=\"#aabb00\">颜色1"  
                +"</p><p><font color=\"#00bbaa
\">颜色2</p><h1>标题1</h1><h3>标题2<
/h3><h6>标题3</h6><p>大于>小于<</p><p>" +  
                "下面是网络图片</p><img src=\"http://avatar.csdn.net/0/3/8/2_zhang957411207.jpg\"/></body></html>";  
          
        tv.setMovementMethod(ScrollingMovementMethod.getInstance());//滚动  
        tv.setText(Html.fromHtml(html));

要实现图片的显示需要使用Html.fromHtml的另外第二个重构方法:

public static Spanned fromHtml (String source, Html.ImageGetterimageGetter, Html.TagHandler tagHandler)

其中Html.ImageGetter是一个接口,我们要实现此接口,在它的getDrawable(String source)方法中返回图片的Drawable对象才可以。

ImageGetter imgGetter = new Html.ImageGetter() {
        public Drawable getDrawable(String source) {
              Drawable drawable = null;
              URL url;  
              try {   
                  url = new URL(source);  
                  drawable = Drawable.createFromStream(url.openStream(), "");  //获取网路图片
              } catch (Exception e) {  
                  return null;  
              }  
              drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
                            .getIntrinsicHeight());
              return drawable; 
        }
};

这里主要是实现了Html.ImageGetter接口,通过图片的URL地址获取相应的Drawable实例。

上面介绍的是显示网络上的图片,但如何显示本地的图片呢:

   ImageGetter imgGetter = new Html.ImageGetter() {
        public Drawable getDrawable(String source) {
              Drawable drawable = null;
               
              drawable = Drawable.createFromPath(source); //显示本地图片
              drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
                            .getIntrinsicHeight());
              return drawable; 
        }
};

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

String source;
    source=getFilesDir()+"/ic_launcher.png";

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

这里主要讲一种场合的使用,来源

http://www.jb51.net/article/36643.htm

然而,有一种场合,默认支持的标签可能不够用。比如,我们需要在textView中点击某种链接,返回到应用中的某个界面,而不仅仅是网络连接,如何实现?

Html类中有一个接口类处理点击标签的处理的:

/** 
    * Is notified when HTML tags are encountered that the parser does 
    * not know how to interpret. 
    */  
   public static interface TagHandler {  
       /** 
        * This method will be called whenn the HTML parser encounters 
        * a tag that it does not know how to interpret. 
        */  
       public void handleTag(boolean opening, String tag,  
                                Editable output, XMLReader xmlReader);
private void handleStartTag(String tag, Attributes attributes) {  
        if (tag.equalsIgnoreCase("br")) {  
            // We don‘t need to handle this. TagSoup will ensure that there‘s a </br> for each <br>   
            // so we can safely emite the linebreaks when we handle the close tag.   
        } else if (tag.equalsIgnoreCase("p")) {  
            handleP(mSpannableStringBuilder);  
        } else if (tag.equalsIgnoreCase("div")) {  
            handleP(mSpannableStringBuilder);  
        } else if (tag.equalsIgnoreCase("em")) {  
            start(mSpannableStringBuilder, new Bold());  
        } else if (tag.equalsIgnoreCase("b")) {  
            start(mSpannableStringBuilder, new Bold());  
        } 
        ..................
        } else if (tag.length() == 2 &&  
                   Character.toLowerCase(tag.charAt(0)) == ‘h‘ &&  
                   tag.charAt(1) >= ‘1‘ && tag.charAt(1) <= ‘6‘) {  
            handleP(mSpannableStringBuilder);  
            start(mSpannableStringBuilder, new Header(tag.charAt(1) - ‘1‘));  
        } else if (tag.equalsIgnoreCase("img")) {  
            startImg(mSpannableStringBuilder, attributes, mImageGetter);  
        } else if (mTagHandler != null) {  
            mTagHandler.handleTag(true, tag, mSpannableStringBuilder, mReader);  
        }  
    }  

    private void handleEndTag(String tag) {  
        if (tag.equalsIgnoreCase("br")) {  
            handleBr(mSpannableStringBuilder);  
        } else if (tag.equalsIgnoreCase("p")) {  
            handleP(mSpannableStringBuilder);  
        } else if (tag.equalsIgnoreCase("div")) {  
            handleP(mSpannableStringBuilder);  
        } else if (tag.equalsIgnoreCase("em")) {  
            end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));  
        } else if (tag.equalsIgnoreCase("b")) {  
            end(mSpannableStringBuilder, Bold.class, new StyleSpan(Typeface.BOLD));  
        }  
           ........................
           ........................
        } else if (tag.length() == 2 &&  
                Character.toLowerCase(tag.charAt(0)) == ‘h‘ &&  
                tag.charAt(1) >= ‘1‘ && tag.charAt(1) <= ‘6‘) {  
            handleP(mSpannableStringBuilder);  
            endHeader(mSpannableStringBuilder);  
        } else if (mTagHandler != null) {  
            mTagHandler.handleTag(false, tag, mSpannableStringBuilder, mReader);  
        }  
    }

如果不是默认的标签,会调用mTagHandler的handleTag方法。所以,我们可以实现此接口,来解析自己定义的标签类型。

自定义一个<game>标签,实现接口

public class GameTagHandler implements TagHandler {  
    private int startIndex = 0;  
    private int stopIndex = 0;  
    @Override  
    public void handleTag(boolean opening, String tag, Editable output,  
            XMLReader xmlReader) {  
        if (tag.toLowerCase().equals("game")) {  
            if (opening) {  
                startGame(tag, output, xmlReader);  
            } else {  
                endGame(tag, output, xmlReader);  
            }  
        }   

    }  
    public void startGame(String tag, Editable output, XMLReader xmlReader) {  
        startIndex = output.length();  
    }  

    public void endGame(String tag, Editable output, XMLReader xmlReader) {  
        stopIndex = output.length();  
        output.setSpan(new GameSpan(), startIndex, stopIndex,  
                    Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);  
    }  

    private class GameSpan extends ClickableSpan implements OnClickListener {  

        @Override  
        public void onClick(View v) {  
            // 跳转某页面  ,自己实现跳转的动作,就可以点击TextView中的指定文字进行自定义的动作的了 
        }  
    }

然后在工程中调用方法:

textView.setText(Html.fromHtml(“点击<game>这里</game>跳转到游戏”,null, new GameTagHandler()));

textView.setClickable(true);

textView.setMovementMethod(LinkMovementMethod.getInstance());

时间: 2024-09-20 06:50:51

TextView使用HTML标签的相关文章

实现FlowLayout 自动排序标签

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38352503 ,本文出自[张鸿洋的博客] 1.概述 上一篇已经基本给大家介绍了如何自定义ViewGroup,如果你还不了解,请查看:Android 手把手教您自定ViewGroup ,本篇将使用上篇介绍的方法,给大家带来一个实例:实现FlowLayout,何为FlowLayout,如果对Java的Swing比较熟悉的话一定不会陌生,就是控件根据ViewGroup的宽,自动的往右

TextView控件

1.TextView是一个标签控件,用于显示提示文件 2.常用属性 setText(text)//定义组件的显示文件 setFilters(filters)//设置组件最大允许长度 setTextColor(colors)//设置组件文本颜色 setTextSize(size)//设置显示的文字大小 I.设置文件的显示风格 normal:正常 bold:粗体 italic:斜体 II.组件大小单位 px.dip.sp.pt.in.mm TextStyle//设置文字显示样式 setSelectA

一起学android之自定义控件一起制作自定义标签(39)

今天我们要实现的效果如下: 当然列表中的标签显示的个数是可控的,实现个数可控的标签的话,我们就需要自定义View. 我们自定义一个抽象类继承LinearLayout并实现我们定义的接口: BaseTagView: /** * 标签,继承此抽象类 * @author LinHai Gu * * @param <T> */ public abstract class BaseTagView<T> extends LinearLayout implements SelectTag<

Android中Textview显示带html文本【Textview显示本地图片】

Textview可以显示基本的HTML标签 <a href="..."> <b> <big> <blockquote> <br> <cite> <dfn> <div align="..."> <em> <font size="..." color="..." face="..."> <

程序猿的技术博客Android客户端--自己挖的坑,还得自己填

还是一样先上图 主要新增: 1.文章详情界面图片点击放大,移动,缩放 2.新增个人资料界面[未完成] 主要涉及知识点: 1.TextView中解析html中img标签,设置点击事件 2.自定义ImageView,实现缩放,移动 3.借鉴FadingActionBar实现FadingToolBar[参考我的资料的截图,采用ToolBar实现] 4.针对网络图片采用Base64编码处理解码成Bitmap 具体讲解TextView中html标签中img设置点击事件监听,代码如下: public cla

用 Eclipse 开发 Android 应用程序

转自:http://www.apkbus.com/android-13828-1-1.html 开始之前 本教程介绍如何在 Eclipse 环境中进行 Android 应用程序开发,包括两个示例应用程序.第一个示例是一个基本的应用程序,涉及构建和调试的所有阶段.第二个应用程序示例涉及比较复杂的 Android 特性,包括联系人搜索和 Google Maps 地址查找.要想从本教程获得最大收益,具备移动开发经验会有帮助,但不是必需的.开发 Android 应用程序需要 Java? 编程技能,但是对

TabHost详解

[转]http://blog.csdn.net/harvic880925/article/details/17120325 前言:今天仔细研究了下TabHost,主要是为了实现微信底部导航栏的功能,最后也给出一个链接,这位老兄用TabHost基本做出来了微信导航栏. 正文 TabHost的实现分为两种,一个是不继承TabActivity,一个是继承自TabActivity:当然了选用继承自TabActivity的话就相对容易一些,下面来看看分别是怎样来实现的吧. 方法一.定义tabhost:不用

Android之TabHost布局

1.概念 盛放Tab的容器就是TabHost.TabHost的实现有两种方式: 第一种继承TabActivity,从TabActivity中用getTabHost()方法获取TabHost.各个Tab中的内容在布局文件中定义就行了. 第二种方式,不继承TabActivity,在布局文件中定义TabHost即可,但是TabWidget的id必须是@android:id/tabs,FrameLayout的id必须是@android:id/tabcontent.  2.案例 1)继承TabActivi

自定义流式布局

1.概述 何为FlowLayout,就是控件根据ViewGroup的宽,自动的往右添加,如果当前行剩余空间不足,则自动添加到下一行.有点所有的控件都往左飘的感觉,第一行满了,往第二行飘~所以也叫流式布局.Android并没有提供流式布局,但是某些场合中,流式布局还是非常适合使用的,比如关键字标签,搜索热词列表等,比如下图: 这些都特别适合使用FlowLayout 2.简单的分析 1.对于FlowLayout,需要指定的LayoutParams,我们目前只需要能够识别margin即可,即使用Mar