android 开发艾特功能,Android 仿微博@ # 艾特 话题功能
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 仿微博@ # 艾特 话题功能相关推荐
- 动态头像 Android 实现,Android开发中实现一个头像滑动变大变小功能
Android开发中实现一个头像滑动变大变小功能 发布时间:2020-11-21 16:36:20 来源:亿速云 阅读:74 作者:Leah 这篇文章给大家介绍Android开发中实现一个头像滑动变大 ...
- Android开发介绍(基于Android Studio软件)
Android开发介绍(基于Android Studio软件) 关于Android开发,笔者走过一些弯路,因此今天总计了有关Android开发的一些内容和心得,希望对大家有所帮助.首先来一张安卓开发者 ...
- android studio开发工具介绍,Android应用开发之Android开发工具介绍、Android Studio配置...
本文将带你了解Android应用开发之Android开发工具介绍.Android Studio配置,希望本文对大家学Android有所帮助. 2.1 Android Studio配置 2.1.1 ...
- 自己写个仿微博的表情包功能
** 自己写个仿微博的表情包功能 ** 前两天写微博系统尝试着写一个表情包系统如图所示: 主体思想是先把图片罗列出来,加上title和name属性,当点击图片时获取图片的name属性,附加在输入框文本 ...
- android点赞取消赞功能吗,Android 仿微博的点赞上报功能,持续点赞再取消
产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网络之后 重 ...
- Android 仿微博的点赞上报功能,持续点赞再取消
产品需求,实现类似微博的持续点赞再取消功能,因为自己也偶尔刷微博,对这功能有一定的使用上的了解, 至于微博点赞的具体实现我并不知道,微博点赞在断网的情况下依然能点赞,不会提示网络异常,等有网络之后 重 ...
- Android开发中ListView多屏的全选、反选功能
[size=medium] 鄙人最近刚开始学习Android,在练习的时候写到一个ListView的全选反选功能.本来以为这个功能很简单,随随便便就能搞定,结果真的下手去做的时候被虐的死去活来,不知道 ...
- Android加载长图,仿微博长图滚动查看
/** * Created by sunrui on 2017/3/8. * 加载长图片 * 解决步骤 * 1.将图片缩放到与控件等宽 * 2.判断缩放后的图片高度,如果高度大于控件高度较多(这里设置 ...
- Android开发知识体系!Android面试吃透这一篇就没有拿不到的offer!挥泪整理面经
1.项目介绍 Flutter是目前比较流行的跨平台开发技术,凭借其出色的性能获得很多前端技术爱好者的关注,比如阿里闲鱼,美团,腾讯等大公司都有投入相关案例生产使用. 基于Flutter+Dart+ch ...
- android开发重要控件,Android界面编程——Android基本控件
Android界面编程 Android应用开发的一项重要内容就是界面开发.对于用户来说,不管APP包含的逻辑多么复杂,功能多么强大,如果没有提供友好的图形交互界面,将很难吸引最终用户. 作为一个程序员 ...
最新文章
- 物体分割--Deep Watershed Transform for Instance Segmentation
- 为AI从业者/研究生/研究员专门定制的全网唯一高端AI训练营
- zerodivisionerror什么意思python-Python中%的结果是什么?
- USACO_1_4_Mother's Milk
- 《高性能MySQL》の复制
- 用Python做垃圾分类
- Android之android studio如何解决‘:app:packageDebug‘.(Duplicate files copied in APK META-INF/DEPENDENCIES)
- Linux如何搭建Java部署环境
- CentOS7 Nexus安装
- (二)Graphivz 简单结构图及子图
- 摄影测量学——解析法相对定向
- 为AspxGridView绑定嵌套数据
- 刘毅5000词汇_不熟词汇整理_lesson_14 and part_4
- 私有云搭建使用docker搭建
- wifi路由器如何连接无线网络连接服务器,wifi路由器的使用方法 | 192路由网
- 关于消防设施的RFID资产管理,RFID消防设施资产管理-新导智能
- Python爬取URP教务系统课程表并保存到excel
- 计算机电脑使用基础知识!
- 存地失人,人地皆失;存人失地,人地皆存。
- web服务器推送技术