public class HtmlText extends TextView {

private Context context;

private String mData;

//接口回调

private OnHtmlTextClick mOnHtmlTextClick;

//初始化接口回调

public void setOnHtmlTextClick(OnHtmlTextClick mOnHtmlTextClick) {

this.mOnHtmlTextClick = mOnHtmlTextClick;

}

//设置点击事件需要上下文

public void init(Context context) {

this.context = context;

}

public HtmlText(Context context) {

super(context);

}

public HtmlText(Context context, @Nullable AttributeSet attrs) {

super(context, attrs);

}

public HtmlText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);

}

@Override

public void setText(CharSequence text, BufferType type) {

//得到String字符

if (text == null) {

mData = "";

} else {

mData = text.toString();

}

/*用Html中重写的TagHandler解析,以Spanned格式输出,这里希望到时候大家更换一下或者自己写一个

方式然后再进行处理,建议用SAX解析方式,大概的思路就是记录当前开始解析的下表以及解析结束的下标

然后实现ClickableSpan接口在的ocClick方法和updateDrawState中进行操作,本人是写了一个接口

回调,吧需要的全部回调过去

*/

Spanned spanned = Html.fromHtml(mData, null, new MyTagHandler());

super.setText(spanned, type);

}

//实现Html.TagHandler接口

class MyTagHandler implements Html.TagHandler {

private int startIndex = 0;

private int stopIndex = 0;

private String mId = "";

private int mType = -1;

private String mName = "";

@Override

//重写handleTag解析

public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {

if (tag.equalsIgnoreCase("user")) {

//如果是开头

if (opening) {

//记录当前下表

startIndex = output.length();

} else {

//结尾开始对数据进行处理

endGame(output);

}

} else if (tag.equalsIgnoreCase("topic")) {

if (opening) {

startIndex = output.length();

} else {

endGame(output);

}

}

}

public void endGame(Editable output) {

//获取到结束位置的下表

stopIndex = output.length();

//使用pull解析,获取标签内的属性

XmlPull(output);

//根据不同的类型添加不同的前缀

if (mType == 1) {

output.insert(startIndex, "@");

} else if (mType == 2) {

output.insert(startIndex, "#");

}

Log.e("yl", "endGame: " + output.toString());

//因为多添加了一个符号所以截止位置需要+1

stopIndex += 1;

//startIndex+1是因为获取name的时候为了不把前缀的符号包括进去所以下标 前移一位

output.setSpan(new GameSpan(output.subSequence(startIndex + 1, stopIndex).toString(),

mId, mType), startIndex, stopIndex, Spanned.SPAN_MARK_MARK);

//在结尾处添加空格

output.insert(stopIndex, " ");

}

//集成ClickableSpan 的点击事件,重写onClick方法

private class GameSpan extends ClickableSpan {

private String mName;

private int mType;

private String mId;

public GameSpan(String mName, String mId, int mType) {

this.mName = mName;

this.mId = mId;

this.mType = mType;

}

@Override

//重写点击事件

public void onClick(View v) {

//设置点击事件

if (mOnHtmlTextClick != null) {

mOnHtmlTextClick.onClick(mName, mId, mType);

}

}

@Override

//对截取出来的字段设置字体颜色

public void updateDrawState(TextPaint ds) {

if (mType == 1) {

ds.setColor(getResources().getColor(R.color.colorAccent));

} else {

ds.setColor(getResources().getColor(R.color.colorPrimary));

}

//设置文字接口回调

if (mOnHtmlTextClick != null) {

mOnHtmlTextClick.onupdateDrawState(ds, mType);

}

}

}

//使用XML中的Pull解析,再次希望各位自己重新写一个解析方式 包括实现方法都不要用Html.TagHandler

private void XmlPull(Editable output) {

try {

//字节数组输入流

ByteArrayInputStream mInputStream;

if (mData != null && !"".equals(mData)) {

//创建字节数组输入流

mInputStream = new ByteArrayInputStream(mData.getBytes());

} else {

return;

}

//创建xmlPull解析器

XmlPullParser parser = Xml.newPullParser();

///初始化xmlPull解析器,内容,格式

parser.setInput(mInputStream, "utf-8");

//读取文件的类型

int type = parser.getEventType();

//无限判断文件类型进行读取

while (type != XmlPullParser.END_DOCUMENT) {

switch (type) {

//开始标签

case XmlPullParser.START_TAG:

//当内容里面包含其中一个标签的时候进行解析处理

if ("user".equals(parser.getName()) || "topic".equals(parser.getName())) {

//必须要先获取属性 如果先获取值 则无法获取到属性

//获取id属性

String id = parser.getAttributeValue(null, "id");

//获取type属性

String strType = parser.getAttributeValue(null, "type");

//获取user或topic的值

mName = parser.nextText();

//如果当前解析的值是当前截取的字段,获取当前解析的属性

if (mName.equals(output.subSequence(startIndex, stopIndex).toString())) {

//属性赋值用于点击事件判断

mId = id;

try {

mType = Integer.valueOf(strType);

} catch (Exception e) {

mType = 0;

}

type = XmlPullParser.END_DOCUMENT;

}

}

break;

//结束标签

case XmlPullParser.END_TAG:

// Log.e("yl", "XmlPull: 结束标签解析");

break;

}

//继续往下读取标签类型

type = parser.next();

}

} catch (Exception e) {

}

}

}

//接口回调

public interface OnHtmlTextClick {

//点击事件回调

void onClick(String name, String id, int type);

//文字颜色回调 包括前缀符号

void onupdateDrawState(TextPaint ds, int type);

}

}

android 开发艾特功能,Android 仿微博@ # 艾特 话题功能相关推荐

  1. 动态头像 Android 实现,Android开发中实现一个头像滑动变大变小功能

    Android开发中实现一个头像滑动变大变小功能 发布时间:2020-11-21 16:36:20 来源:亿速云 阅读:74 作者:Leah 这篇文章给大家介绍Android开发中实现一个头像滑动变大 ...

  2. Android开发介绍(基于Android Studio软件)

    Android开发介绍(基于Android Studio软件) 关于Android开发,笔者走过一些弯路,因此今天总计了有关Android开发的一些内容和心得,希望对大家有所帮助.首先来一张安卓开发者 ...

  3. android studio开发工具介绍,Android应用开发之Android开发工具介绍、Android Studio配置...

    本文将带你了解Android应用开发之Android开发工具介绍.Android Studio配置,希望本文对大家学Android有所帮助. 2.1   Android Studio配置 2.1.1 ...

  4. 自己写个仿微博的表情包功能

    ** 自己写个仿微博的表情包功能 ** 前两天写微博系统尝试着写一个表情包系统如图所示: 主体思想是先把图片罗列出来,加上title和name属性,当点击图片时获取图片的name属性,附加在输入框文本 ...

  5. android点赞取消赞功能吗,Android 仿微博的点赞上报功能,持续点赞再取消

    产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网络之后 重 ...

  6. Android 仿微博的点赞上报功能,持续点赞再取消

    产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网络之后 重 ...

  7. Android开发中ListView多屏的全选、反选功能

    [size=medium] 鄙人最近刚开始学习Android,在练习的时候写到一个ListView的全选反选功能.本来以为这个功能很简单,随随便便就能搞定,结果真的下手去做的时候被虐的死去活来,不知道 ...

  8. Android加载长图,仿微博长图滚动查看

    /** * Created by sunrui on 2017/3/8. * 加载长图片 * 解决步骤 * 1.将图片缩放到与控件等宽 * 2.判断缩放后的图片高度,如果高度大于控件高度较多(这里设置 ...

  9. Android开发知识体系!Android面试吃透这一篇就没有拿不到的offer!挥泪整理面经

    1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. 基于Flutter+Dart+ch ...

  10. android开发重要控件,Android界面编程——Android基本控件

    Android界面编程 Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户. 作为一个程序员 ...

最新文章

  1. 物体分割--Deep Watershed Transform for Instance Segmentation
  2. 为AI从业者/研究生/研究员专门定制的全网唯一高端AI训练营
  3. zerodivisionerror什么意思python-Python中%的结果是什么?
  4. USACO_1_4_Mother's Milk
  5. 《高性能MySQL》の复制
  6. 用Python做垃圾分类
  7. Android之android studio如何解决‘:app:packageDebug‘.(Duplicate files copied in APK META-INF/DEPENDENCIES)
  8. Linux如何搭建Java部署环境
  9. CentOS7 Nexus安装
  10. (二)Graphivz 简单结构图及子图
  11. 摄影测量学——解析法相对定向
  12. 为AspxGridView绑定嵌套数据
  13. 刘毅5000词汇_不熟词汇整理_lesson_14 and part_4
  14. 私有云搭建使用docker搭建
  15. wifi路由器如何连接无线网络连接服务器,wifi路由器的使用方法 | 192路由网
  16. 关于消防设施的RFID资产管理,RFID消防设施资产管理-新导智能
  17. Python爬取URP教务系统课程表并保存到excel
  18. 计算机电脑使用基础知识!
  19. 存地失人,人地皆失;存人失地,人地皆存。
  20. web服务器推送技术

热门文章

  1. unity如何平铺素材,并将碰撞体平铺
  2. 十六.静态页面抽取模板 2021-03-31
  3. android声控代码,Android Studio 第七十一期 - Android 系统声音控制
  4. dataGrip历史版本下载地址
  5. SpEL表达式注入、Spring JNDI注入
  6. 质量员考试建筑八大员考试建筑消防设施工程质量的控制措施
  7. 秒大刀之旅----M2模型绘制
  8. 支持创新,有奖补可申报,武汉最高2000万
  9. 哄MM的词,经典哦!
  10. UR机械臂学习(4):UR机械臂仿真