Android TextView显示表情图片、标签、超链接

因为项目需求,要在用户发布动态的时候可以打上标签,超链接,还有图片标签,本来不打算写这篇博客,在查阅资料的时候我发现网上的博客都是类似的,大家你抄我,我抄你,抄来抄去,这就是所谓的拿来主义吧,盗版在国内太过泛滥,不多说,切入正题,先来看下我们今天研究的效果图

我研究了下微博和QQ的动态,发现他们的内容描述都有一个共同点——用html写的?,我查了些资料,主要涉及到以下问题:

  • 1、TextView是如何处理html
  • 2、TextView是如何显示html中图片的
  • 3、TextView是如何处理html中的超链接、标签的点击问题
  • 4、如果有自定义标签,该如何处理
    既然明确的问题,接下来我们来一个个解决

来看下我们今天要用到的API:

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

来看看具体的实现

String html = "<p>点击打开我的博客<a href=\"http://blog.csdn.net/u013653230\">diy_coder</a></p>"+ "<p>这个<a href=\"#搞笑视频\">#搞笑视频#</a>笑死我了,哈哈,快来看看"+ "<a href=\"@24710\">@生活如此多娇</a></p>"+ "<p><tag>云音乐福利</tag></p>"
//            + "<p><img src=\"" + R.mipmap.ic_launcher + "\"/></p>"+ "<p><img src=\"http://avatar.csdn.net/E/F/8/1_u013653230.jpg\"></p>";private static final int TOPIC_TAG = 0;private static final int AT_USER = 1;private static final int NORMAL_URL = 2;private static final int CUSTOM_TAG = 3;private Context mContext;private TextView tv_html;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mContext = this;tv_html = (TextView) findViewById(R.id.tv_html);tv_html.setText(getClickableHtml(html));tv_html.setClickable(true);tv_html.setMovementMethod(LinkMovementMethod.getInstance());}private CharSequence getClickableHtml(String html) {Spanned spannedHtml = Html.fromHtml(html, mImageGetter, new CustomTagHandler());SpannableStringBuilder clickableHtmlBuilder = new SpannableStringBuilder(spannedHtml);URLSpan[] urls = clickableHtmlBuilder.getSpans(0, spannedHtml.length(), URLSpan.class);for (final URLSpan span : urls) {int start = clickableHtmlBuilder.getSpanStart(span);int end = clickableHtmlBuilder.getSpanEnd(span);int flag = clickableHtmlBuilder.getSpanFlags(span);final String url = span.getURL();setUpUrl(clickableHtmlBuilder, span, start, end, flag, url);}return clickableHtmlBuilder;}private void setUpUrl(SpannableStringBuilder clickableHtmlBuilder, URLSpan span, int start, int end, int flag, final String url) {CustomClickableSpan clickableSpan = null;if (url.startsWith("@")) {clickableSpan = new CustomClickableSpan(AT_USER, url);} else if (url.startsWith("#")) {clickableSpan = new CustomClickableSpan(TOPIC_TAG, url);} else if (url.startsWith("http") || url.startsWith("https")) {clickableSpan = new CustomClickableSpan(NORMAL_URL, url);}clickableHtmlBuilder.removeSpan(span);//清除当前spanclickableHtmlBuilder.setSpan(clickableSpan, start, end, flag);}//处理点击事件class CustomClickableSpan extends ClickableSpan {String text;int type;public CustomClickableSpan(int type, String text) {this.text = text;this.type = type;}@Overridepublic void updateDrawState(TextPaint ds) {int color = getResources().getColor(R.color.blue);ds.setColor(color);//设置点击文字的颜色ds.setUnderlineText(false); //去掉下划线}@Overridepublic void onClick(View widget) {//点击事件处理Intent intent = null;switch (type) {case AT_USER://@用户intent = new Intent(mContext, UserActivity.class);intent.putExtra("userId", text);break;case TOPIC_TAG://#话题#intent = new Intent(mContext, TopicActivity.class);intent.putExtra("topic", text);break;case NORMAL_URL://网页intent = new Intent(mContext, WebActivity.class);intent.putExtra("url", text);break;case CUSTOM_TAG://自定义标签intent = new Intent(mContext, CustomTagActivity.class);intent.putExtra("tag", text);break;}startActivity(intent);}}//处理自定义标签class CustomTagHandler implements Html.TagHandler {private int startIndex = 0;private int stopIndex = 0;@Overridepublic void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {if (tag.toLowerCase().equals("tag")) {//自定义标签处理if (opening) {//开始标签startTag(tag, output, xmlReader);} else {//结束标签endTag(tag, output, xmlReader);}}}public void startTag(String tag, Editable output, XMLReader xmlReader) {startIndex = output.length();}public void endTag(String tag, Editable output, XMLReader xmlReader) {stopIndex = output.length();String content = output.subSequence(startIndex, stopIndex).toString();//获取点击内容output.setSpan(new CustomClickableSpan(CUSTOM_TAG, content), startIndex, stopIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);Log.e("clickText ", content);}}//绘制图片class URLDrawable extends BitmapDrawable {public Bitmap bitmap;@Overridepublic void draw(Canvas canvas) {super.draw(canvas);if (bitmap != null) {canvas.drawBitmap(bitmap, 0, 0, getPaint());}}}//处理图片Html.ImageGetter mImageGetter = new Html.ImageGetter() {private URLDrawable urlDrawable = new URLDrawable();//加载网络图片@Overridepublic Drawable getDrawable(String source) {Picasso.with(mContext).load(source).into(new Target() {@Overridepublic void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {urlDrawable.bitmap = bitmap;urlDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());//不加这个图片加载不上来,不知道什么原因tv_html.setText(tv_html.getText());}@Overridepublic void onBitmapFailed(Drawable errorDrawable) {}@Overridepublic void onPrepareLoad(Drawable placeHolderDrawable) {}});return urlDrawable;}//         加载本地图片
//        @Override
//        public Drawable getDrawable(final String source) {//            int id = Integer.parseInt(source);
//            Drawable drawable = mContext.getResources().getDrawable(id);
//            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable
//                    .getIntrinsicHeight());
//            return drawable;
//        }};

来看下效果图

Android TextView显示表情、标签、超链接相关推荐

  1. android textview显示表情,在Android TextView中显示表情符号/情感图标

    我在Android TextView中显示表情符号图标时遇到一些问题 首先,我在这里找到了Unicode表情符号图标列表:http : //www.easyapns.com/category/just ...

  2. android textview 显示表情和文字 表情带超链接

    public int getResourceId(String name){try {//根据资源的id的变量名获得field对象.使用反射来实现的Field field = R.drawable.c ...

  3. android textview 显示一行,且超出自动截断,显示...

    1)设置文本是否包含顶部和底部的额外空白 在xml文件的TextView控件中加入如下属性: android:includeFontPadding="false" 2)有时直接引用 ...

  4. Android TextView显示网络图片

    前言:程序猿真的是有个通病啊,电梯上就在研究电梯的逻辑代码,走路看到红绿灯也会去研究算法,今天心情不错,于是就发了一个说说,发现某q空间中显示了我发的说说,但是我发的笑脸跟哭脸表情由于网络慢,很久才加 ...

  5. html设置ios状态栏颜色,ios 显示html标签,超链接颜色以及下划线的处理

    有的时候,我们的app需要显示html标签的效果,这个时候,如果需求不是特别复杂的话,我们都是可以使用textView来实现的.对冉Label也可以实现,但是label很难实现超链接的点击效果,所以, ...

  6. Android TextView 显示HTML加图片

    TextView显示网络图片,我用android2.3的系统,可以显示图片出来,并且如果图片比较大,应用会卡的现象,肯定是因为使用主线程去获取网络图片造成的,但如果我用android4.0以上的系统运 ...

  7. 【TextView】Android TextView显示省略号的问题(关于TextView maxLength 和maxEms的学习)

    1.TextView的属性maxLength和maxEms 1). maxLength 作用:设置TextView 文本显示的个数 理解:把text的字符取出来,截取了指定个数个字符,然后将截取的字符 ...

  8. android textview表情,Android开发(16)-TextView显示表情图像和文字

    从这个案例中我们可以学到当我们美化图片美化界面的时候可以在某一区域输入图片和文字混搭信息,第三张图片按比例缩小,第四张图像有超链接 布局文件 MainActivity.java package com ...

  9. android TextView显示文字和图片

    为什么80%的码农都做不了架构师?>>>    在做web的时候jsp页面可以直接显示一段html代码,如: <html><head><title> ...

  10. android 显示图片和文字,android TextView显示文字和图片

    在做web的时候jsp页面可以直接显示一段html代码,如: TextView使用HTML 强调 斜体 " +" 超链接HTML入门学习HTML! 颜色1" +" ...

最新文章

  1. C++ 优先级队列 priority_queue
  2. uva 11992 - Fast Matrix Operations
  3. 输入引脚时钟约束_最强干货分享 | 时钟树例外(exclude pin、stop pin、non_stop pin、float pin)...
  4. 产品经理岗位职责说明_11份公司高层管理人员的岗位职责说明书,改改就能用,拿去参考...
  5. 一个粗糙的js分页判断
  6. IDEA 2017破解 license server激活
  7. Leetcode刷题-707:设计链表
  8. PHPExcel浏览器输出Excel2007出错
  9. Turtle库绘画实例
  10. Java包的简单理解
  11. php dsp 使用量,DSP广告需求方平台——新数网络
  12. fedora 16 安装后的基本配置
  13. php中或者符号,php中的或运算符号
  14. Tensorflow2.x 利用“GradientTape 梯度带”自动求梯度
  15. NOI模拟 : Vain (并查集维护割点)
  16. 安卓恢复大师怎样恢复手机删除的照片
  17. 如何使用python编程解决生活中的问题-日常工作问题处理中Python程序的运用
  18. 【离散数学期复习系列】二、一阶逻辑(谓词逻辑)
  19. 一起读Java编程思想(2)---构造器的初始化与清理
  20. 转载 一篇好文,以在迷茫时阅读

热门文章

  1. DP转HDMI/VGA方案设计电路图参考|AG6320参考电路原理图PCB电路图
  2. EVE-NG 入门教程 (Mac OSX BIg Sur)
  3. 科学技术法-正则表达式-QT
  4. 生命也如同平常到化入夏风里的蝉鸣
  5. iOS平台游戏安全之IPA破解原理及防御(第三弹)
  6. 操作系统 面试问题_操作系统面试问答
  7. 音视频开发之Android端native层播放音频三种方式
  8. 时尚亲民的发烧耳机,无需焊接的模块化设计,小蝙蝠M0体验
  9. 十几减9的口算题_一年级数学《口算十几减9》教案
  10. Google Map MarkerCluster 点聚合使用简介