Android:借用html标签协议,定义自己的协议

来源:互联网 发布:mfc编程实例 2008 编辑:程序博客网 时间:2024/05/16 12:31

Android:借用html标签协议,定义自己的协议

背景

使用html,定制自己的标签协议:比如:

今日有好货,<a href="https://www.taobao.com">点我逛淘宝</a>,有惊喜!!

或者

今日有好货,<a href="page://taobao_home">点我逛淘宝</a>,有惊喜!!

当一个TextView显示上述内容时,还可以点击上面的文字,然后跳转到对应的页面。

解决思路

使用Html.fromHtml对含有标签的文本进行解析,然后重新为其添加自定义的Span

    ...    /**     * 绑定解析的Html     *     * @param mContentTv 目标的TextView控件     * @param content 含有html标签的文本内容     */     private void bindContentView(final TextView mContentTv, final String content) throws Throwable {        mContentTv.setMovementMethod(LinkMovementMethod.getInstance());        String text = mContentTv.getText().toString();        //解析html        Spanned spanned = Html.fromHtml(content);        //获取其中的URL链接的Span        URLSpan[] spans = spanned.getSpans(0, content.length(), URLSpan.class);        if (spans != null) {            //转化为子类            SpannableStringBuilder spannableStringBuilder = (SpannableStringBuilder) spanned;            for (URLSpan urlSpan : spans) {                //获取span的起始位置                int start = spanned.getSpanStart(urlSpan);                int end = spanned.getSpanEnd(urlSpan);                int flag = spanned.getSpanFlags(urlSpan);                //获取href的链接                final String pageName = urlSpan.getURL();                spannableStringBuilder.removeSpan(urlSpan);                if (start > end || start < 0) {                    continue;                }                //设置点击事件                spannableStringBuilder.setSpan(new ColorClickableSpan() {                    @Override                    public void onClick(View view) {                         //to open the pageName here                    }                }, start, end, flag);            }            mContentTv.setText(spannableStringBuilder);        } else {            mContentTv.setText(spanned);        }        mContentTv.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View view) {                //to do            }        });    }    ...

其中,我们也可以定制超链接部分的样式:

import android.text.TextPaint;import android.text.style.ClickableSpan;import android.view.View;/** * @version mochuan.zhb on 2013/3/3. * @Author Zheng Haibo * @Company Alibaba Group * @PersonalWebsite http://github.com/nuptboyzhb * @Description 去掉下滑线的点击span */public class FollowClickableSpan extends ClickableSpan {// extend ClickableSpan    @Override    public void onClick(View view) {    }    @Override    public void updateDrawState(TextPaint ds) {// override updateDrawState        ds.setUnderlineText(false); // set to false to remove underline        ds.setColor(0xff009ff0);    }}

同样的思路,我们可以对其他html标签进行解析,然后进行改造;比如:

你还有<font color="#f00">20</font>项代办事情
   /**     * 将所有的font前景色标签,进行颜色重置     *     * @param content     * @param colorValue     * @return     */    private CharSequence parseSpanResetColor(String content, int colorValue) {        try {            Spanned spanned = Html.fromHtml(content);            SpannableStringBuilder spannableStringBuilder = (SpannableStringBuilder) spanned;            ForegroundColorSpan[] spans = spanned.getSpans(0, content.length(), ForegroundColorSpan.class);            if (spans.length > 0) {                for (ForegroundColorSpan foregroundColorSpan : spans) {                    int start = spanned.getSpanStart(foregroundColorSpan);                    int end = spanned.getSpanEnd(foregroundColorSpan);                    int flag = spanned.getSpanFlags(foregroundColorSpan);                    spannableStringBuilder.removeSpan(foregroundColorSpan);                    spannableStringBuilder.setSpan(new ForegroundColorSpan(colorValue), start, end, flag);                }            }            return spannableStringBuilder;        } catch (Exception e) {            e.printStackTrace();        }        return new SpannableString(content);    }
原创粉丝点击