Android仿微信@好友功能 输入@跳转、删除整块

最近在做聊天功能的时候,有一个需求是仿照微信做@好友的功能,本来以为挺简单,但是做到这块的时候,发现和想象的有点不一样,什么整块删除,块可编辑,总之,加个@的功能很简单,但是要做和微信的一样还是费了一些功夫,下面是一个demo仅供参考,防止遗忘

先上个效果图

就是这么个功能

1. 分析需求

输入@跳转到联系人界面,选中一个或者多个好友返回到当前界面

按退格键删除整块内容

块内的内容可编辑,编辑完了之后将不附带@功能,只是单纯的文字

2. 开始编码

既然是文本输入首先继承EditText自定义一个控件

public class MsgEditText extends AppCompatEditText { public MsgEditText(Context context) { super(context); } public MsgEditText(Context context, AttributeSet attrs) { super(context, attrs); } public MsgEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } }

到底从哪里开始入手呢,首先完成变成块的需求,

无意中看到这个项目https://github.com/g707175425/CloudEditText ,他是这么写的

private void generateOneSpan(Spannable spannableString, UnSpanText unSpanText) { //生成一个TextView View spanView = getSpanView(getContext(), unSpanText.showText.toString(), getMeasuredWidth()); //再将TextView转换为一个图片 BitmapDrawable bitmpaDrawable = (BitmapDrawable) UIUtils.convertViewToDrawable(spanView); bitmpaDrawable.setBounds(0, 0, bitmpaDrawable.getIntrinsicWidth(), bitmpaDrawable.getIntrinsicHeight()); //最后将这个图片放到Span里, MyImageSpan what = new MyImageSpan(bitmpaDrawable, unSpanText.showText.toString(),unSpanText.returnText); final int start = unSpanText.start; final int end = unSpanText.end; spannableString.setSpan(what, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); //设置一个Span spannableString.setSpan(touchableSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }

看到这里我们就记得了一个关于SpanableString的用法,它可以设置图片,可以随意的设置文字的背景的前景,等等一系列比较酷炫的效果,而且只需要一个TextView,如果需要深入了解Span,可自行百度和Google,关于Span的进阶用法,于是就有了下面的实现

//这个是需要成块删除的内容 private class MyTextSpan extends MetricAffectingSpan { private String showText; private long userId; //userId是为了适应需求,如果不需要请自行去掉 public MyTextSpan(String showText, long userId) { this.showText = showText; this.userId = userId; } public String getShowText() { return showText; } public long getUserId() { return userId; } @Override public void updateMeasureState(TextPaint p) { } @Override public void updateDrawState(TextPaint tp) { } } //这个是非整块删除的内容,当然你如果想也是可以删除的 private class UnSpanText { int start; int end; String returnText; UnSpanText(int start, int end, String returnText) { this.start = start; this.end = end; this.returnText = returnText; } }

刚开始我是这么写的

//外部调用一个增加Span的方法 public void addSpan(String showText, String returnText, long userId) { getText().append(showText); SpannableString spannableString = new SpannableString(getText()); makeSpan(spannableString, new UnSpanText(spannableString.length() - showText.length(), spannableString.length(), showText, returnText), userId); setText(spannableString); setSelection(spannableString.length()); } //生成一个需要整体删除的Span private void makeSpan(Spannable sps, UnSpanText unSpanText, long userId) { MyTextSpan what = new MyTextSpan(unSpanText.returnText, userId); int start = unSpanText.start; int end = unSpanText.end; sps.setSpan(what, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); }

写到现在这个整块添加已经做好了,下面开始做整块删除,刚开始的时候我是模仿上面的CloudEditText写的,但我发现好像会用各种问题,于是想了一种方法

@Override protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) { super.onTextChanged(text, start, lengthBefore, lengthAfter); //向前删除一个字符,@后的内容必须大于一个字符,可以在后面加一个空格 if (lengthBefore == 1 && lengthAfter == 0) { MyTextSpan[] spans = getText().getSpans(0, getText().length(), MyTextSpan.class); for (MyTextSpan myImageSpan : spans) { if (getText().getSpanEnd(myImageSpan) == start && !text.toString().endsWith(myImageSpan.getShowText())) { getText().delete(getText().getSpanStart(myImageSpan), getText().getSpanEnd(myImageSpan)); break; } } } }

上面的意思就是,如果你在EditText中执行删除一个字符的时候,判断前面一个是否是一个Span,如果是自定义的Span就把Span一同删除,关于这个,我可是测试可各种操作才定为这样的

最后是获取需要@的人员名单

//获取用户Id列表,这只是个参考,可根据需求修改 public String getUserIdString() { MyTextSpan[] spans = getText().getSpans(0, getText().length(), MyTextSpan.class); StringBuilder builder = new StringBuilder(); for (MyTextSpan myTextSpan : spans) { String realText = getText().toString().substring(getText().getSpanStart(myTextSpan), getText().getSpanEnd(myTextSpan)); String showText = myTextSpan.getShowText(); if (realText.equals(showText)) { builder.append(myTextSpan.getUserId()).append(","); } } if (!TextUtils.isEmpty(builder.toString())) { builder.deleteCharAt(builder.length() - 1); } return builder.toString(); }

最后我就大方的放个地址你们自己看吧

https://github.com/ddssingsong/AtFriend

总结

以上所述是小编给大家介绍的Android仿微信@好友功能 输入@跳转、删除整块,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

时间: 2024-08-29 07:45:31

Android仿微信@好友功能 输入@跳转、删除整块的相关文章

Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能_Android

如何为不同的list item呈现不同的菜单,本文实例就为大家介绍了Android仿微信或QQ滑动弹出编辑.删除菜单效果.增加下拉刷新等功能的实现,分享给大家供大家参考,具体内容如下 效果图: 1. 下载开源项目,并将其中的liberary导入到自己的项目中: 2. 使用SwipeMenuListView代替ListView,在页面中布局: <android.support.v4.widget.SwipeRefreshLayout android:id="@+id/swipeRefresh

Android 仿微信朋友圈点赞和评论弹出框功能_Android

贡献/下载源码:https://github.com/mmlovesyy/PopupWindowDemo 本文简单模仿微信朋友圈的点赞和评论弹出框,布局等细节请忽略,着重实现弹出框.发评论,及弹出位置的控制. 1. 微信弹出框 微信朋友圈的点赞和评论功能,有2个组成部分: 点击左下角的"更多"按钮,弹出对话框: 点击评论,弹出输入框,添加评论并在页面中实时显示:   微信朋友圈点赞和评论功能 2. 实际效果 本文将建一个 ListView,在其 Item 中简单模仿微信的布局,然后着重

Android仿微信支付密码弹出层功能

预览 使用 这个弹出层是一个DialogFragment,逻辑都封装在其内部,使用起来很简单: Bundle bundle = new Bundle(); bundle.putString(PayFragment.EXTRA_CONTENT, "提现:¥ " + 100.00); PayFragment fragment = new PayFragment(); fragment.setArguments(bundle); fragment.setPaySuccessCallBack(

Android仿微信雷达辐射搜索好友(逻辑清晰实现简单)_Android

不知不觉这个春节也已经过完了,遗憾家里没网,没能及时给大家送上祝福,今天回到深圳,明天就要上班了,小伙伴们是不是和我一样呢?今天讲的是一个大家都见过的动画,雷达搜索好友嘛,原理也十分的简单,你看完我的分析,也会觉得很简单了,国际惯例,无图无真相,我们先看看效果图,对了,真 测试机送人了,所讲这段时间应该一直用模拟器显示吧! 仿微信雷达扫描,仿安卓微信.云播雷达扫描动画效果点击中间的黑色圆圈开始扫描动画,再次点击复位,需要这种效果的朋友可以自己下载看一下. 效果图如下所示: 这个界面相信大家都认识

华为 动画效果 无效-android 仿微信在application里面设置页面跳转动画的theme 有些机型没有效果

问题描述 android 仿微信在application里面设置页面跳转动画的theme 有些机型没有效果 想做一个仿微信的左右切换动画,根据这篇文章的写法 ,发现,华为p7 系统是4.4.2 上面,根本不起作用,还是手机默认的动画效果,只有在代码里写 override 动画才起作用,求解决方案

Android仿微信发表说说实现拍照、多图上传功能_Android

本文实例为大家分享了Android仿微信发表说说.心情功能,供大家参考,具体内容如下 既能实现拍照,选图库,多图案上传的案例,目前好多App都有类似微信朋友圈的功能,能过发表说说等附带图片上传.下面的就是实现该功能的过程:大家还没有看过Android Retrofit 2.0框架上传图片解决方案这篇文章,在看今天的就很容易,接在本项目中用到了一个library:photopicker,封装了图片的选择功能,是否选相机,还有选中图片后可以查看图片的功能.   一. 首先:将photopicker到

Android仿微信QQ设置图形头像裁剪功能_Android

最近在做毕业设计,想有一个功能和QQ一样可以裁剪头像并设置圆形头像,额,这是设计狮的一种潮流. 而纵观现在主流的APP,只要有用户系统这个功能,这个需求一般都是在(bu)劫(de)难(bu)逃(xue)! 图片裁剪实现方式有两种,一种是利用系统自带的裁剪工具,一种是使用开源工具Cropper.本节就为大家带来如何使用系统自带的裁剪工具进行图片裁剪~ 还是先来个简单的运行图. 额,简单说下,我待会会把代码写成小demo分享给大家,在文章末尾会附上github链接,需要的可以自行下载~ 下面来简单分

Android仿微信语音聊天功能_Android

本文实例讲述了Android仿微信语音聊天功能代码.分享给大家供大家参考.具体如下: 项目效果如下: 具体代码如下: AudioManager.java package com.xuliugen.weichat; import java.io.File; import java.io.IOException; import java.util.UUID; import android.media.MediaRecorder; public class AudioManager { private

Android仿微信发表说说实现拍照、多图上传功能

本文实例为大家分享了Android仿微信发表说说.心情功能,供大家参考,具体内容如下 既能实现拍照,选图库,多图案上传的案例,目前好多App都有类似微信朋友圈的功能,能过发表说说等附带图片上传.下面的就是实现该功能的过程:大家还没有看过Android Retrofit 2.0框架上传图片解决方案这篇文章,在看今天的就很容易,接在本项目中用到了一个library:photopicker,封装了图片的选择功能,是否选相机,还有选中图片后可以查看图片的功能. 一. 首先:将photopicker到工程