@好友的EditText
类似微信聊天中的@好友功能,封装到一个EditText中,gist打不开了,直接贴代码到这里吧:
/**
* @好友的输入组件
*/
public class AtEditText extends EditText {
/**
* @的text的最长长度,根据addAt方法来更新
*/
private int mMaxAtTextLength = 4;
private OnAtChangedListener mOnAtInputedListener = null;
public AtEditText(Context context) {
this(context, null);
}
public AtEditText(Context context, AttributeSet attrs) {
super(context, attrs);
init(context, attrs);
}
public AtEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context, attrs);
}
public void setOnAtInputedListener(OnAtChangedListener l) {
mOnAtInputedListener = l;
}
/**
* 以@方式添加一个text
*
* @param atText
*/
public void addAt(String atText) {
if (TextUtils.isEmpty(atText)) {
return;
}
// 前面插入@,后面插入空格
String str = "@" + atText + " ";
Editable edit = getEditableText();
edit.insert(getSelectionEnd(), str);
// 更新最长的@ length
int len = atText.length();
if (len + 1 > mMaxAtTextLength) {
mMaxAtTextLength = len + 1;
}
}
/**
* @param atText
* @return 返回将会插入到edit的带@的text,不会插入到EditText中
*/
public String sudoAddAt(String atText) {
if (TextUtils.isEmpty(atText)) {
return null;
}
// 前面插入@,sudo后面不插入空格
String str = "@" + atText;
return str;
}
private void init(Context context, AttributeSet attrs) {
this.addTextChangedListener(new AtTextWatcher());
}
private int[] findAt(Editable edit, int position) {
if (edit == null) {
return null;
}
if (edit.length() < 2) {
return null;
}
if (position < 2) {
return null;
}
if (position > edit.length()) {
return null;
}
String str = edit.toString();
for (int i = position - 1, j = 0; i >= 0 && j < mMaxAtTextLength; i--, j++) {
if (' ' == str.charAt(i)) {
return null;
}
if ('@' == str.charAt(i)) {
int startOfDel = i;// 删除的开始index
int endOfDel = position;
return new int[] { startOfDel, endOfDel };
}
}
return null;
}
private class AtTextWatcher implements TextWatcher {
private int countOfBefore = 0;
private char onC = 1;
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
countOfBefore = s.length();
if (getSelectionEnd() - 1 > -1 && getSelectionEnd() - 1 < s.length()) {
onC = s.charAt(getSelectionEnd() - 1);
}
}
@Override
public void afterTextChanged(Editable edit) {
int countOfAfter = edit.length();
int offset = countOfAfter - countOfBefore;
if (offset == 1) {// 在输入
if (getSelectionEnd() - 1 > -1 && getSelectionEnd() - 1 < edit.length()) {
char c = edit.charAt(getSelectionEnd() - 1);
if (c == '@') {// 在输入@
if (mOnAtInputedListener != null) {
if (mOnAtInputedListener.onAtInputed() == true) {
edit.delete(getSelectionEnd() - 1, getSelectionEnd());
}
}
}
}
} else if (offset == -1) {// 在删除
if (onC == ' ') {// 在删除空格
int[] delIndexs = findAt(edit, getSelectionEnd());
if (delIndexs != null && delIndexs.length == 2) {
int startOfDel = delIndexs[0];
int endOfDel = delIndexs[1];
CharSequence cs = edit.subSequence(startOfDel + 1, endOfDel);
edit.delete(startOfDel, endOfDel);
if (mOnAtInputedListener != null && cs != null) {
mOnAtInputedListener.onAtDeleted(cs.toString());
}
}
}
}
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
}
/**
* 与@相关的输入变化时
*
* @author viyu
*
*/
public interface OnAtChangedListener {
/**
* 当输入了@的时候回调
*
* @return true if你要删除刚刚输入的@,自己接管;false的话就不管
*/
public boolean onAtInputed();
/**
* 当删除了一个 "@abc "的时候的回调
*
* @param textWithoutAt
* "@abc "被删除的话,就是"abc"
*/
public void onAtDeleted(String textWithoutAt);
}
}
@好友的EditText的更多相关文章
- Android中使用ExpandableListView实现好友分组
一个视图显示垂直滚动两级列表中的条目.这不同于列表视图,允许两个层次,类似于QQ的好友分组.要实现这个效果的整体思路为: 1.要给ExpandableListView 设置适配器,那么必须先设置数据源 ...
- Android ListView用EditText实现搜索功能
前言 最近在开发一个IM项目的时候有一个需求就是,好友搜索功能.即在EditText中输入好友名字,ListView列表中动态展示刷选的好友列表.我把这个功能抽取出来了,先贴一下效果图: 分析 在查阅 ...
- 【Android 界面效果12】EditText中的多行输入问题
------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 我们在使用EditText进行多行输入的时候,通常的写法如下: <EditText android ...
- Android学习--------实现增删改查数据库操作以及实现相似微信好友对话管理操作
版权声明:本文为博主原创文章,转载请注明原文地址.谢谢~ https://blog.csdn.net/u011250851/article/details/26169409 近期的一个实验用到东西挺多 ...
- Android中集成QQ登陆和QQ好友分享及QQ空间分享
extends : http://blog.csdn.net/arjinmc/article/details/38439957 相关官方文档及下载地址: 如果只用分享和登陆,用lite包就可以,体积小 ...
- EditText中禁止输入中文的方法
应用场景 在Android应用中有时需要EditText中只允许输入约定的一些字符,禁止输入其他字符.这里列举了一些可能的应用场景. 1. 场景一 在通讯录保存好友信息界面中填写好友的电话号码时,应当 ...
- EditText中输入信息的限制的方法
应用场景 在Android应用中有时需要EditText中只允许输入约定的一些字符,禁止输入其他字符.这里列举了一些可能的应用场景. 1. 场景一 在通讯录保存好友信息界面中填写好友的电话号码时,应当 ...
- Android:仿手机QQ好友动态的ListView
1.介绍: 本博客使用XListView模仿Android版QQ好友动态的ListView效果.效果截图例如以下: 效果图1 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...
- EditText 基本用法
title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
随机推荐
- PS 切图
1.选择要切哪一块 比如:要切取人物图片, 会自动选择所选的图层 打开关闭某个图层 然后在图层上点击右键,选择合并组 然后Ctrl+c复制--ctrl+n新建画板--
- [No00007C]dreamweaver cc 注释快捷键
设置快捷键入口:编辑->快捷键 打开后: 先复制一份快捷键拷贝(系统自带的不让修改), 选择代码编辑 下拉到后面,设置快捷键
- 鼠标/手指相对于元素的坐标(px转百分比)
鼠标/手指相对于元素的坐标:鼠标或手指当前的位置 - 元素距离文档的位置 px转百分比:px / 文档尺寸 * 100 获取手指触摸在屏幕中相对于元素的坐标(px转百分比): $('#div').on ...
- MySQL数据类型-decimal详解
from:http://www.linuxidc.com/Linux/2013-07/88032.htm 1.首先,对于精度比较高的东西,比如money,我会用decimal类型,不会考虑float, ...
- 监控jvm的一个坑
监控jvm的一个坑 1,遇到的问题 我按照以往文档,在catalina.sh里追加jvm的监控api,如下 紧接着我启动 tomcat. 未报任何错误. 发现 lsof –i:12000, 12000 ...
- NPM 无法下载任何包的原因,解决方法
前几天发现NPM 无法现在任何的包 通过npm i testPackage -ddd 发现 是卡在了 npm verb addRemoteTarball 这行,google后发现 是有多个tmp地址, ...
- Charles 如何抓取https数据包
Charles可以正常抓取http数据包,但是如果没有经过进一步设置的话,无法正常抓取https的数据包,通常会出现乱码.举个例子,如果没有做更多设置,Charles抓取https://www.bai ...
- 20145215&20145307信息安全系统设计基础实验报告
20145215&20145307信息安全系统设计基础实验报告 PART1 一.实验原理 交叉编译,简单地说,就是在一个平台上生成另一个平台上的可执行代码.同一个体系结构可以运行不同的操作系统 ...
- 1122MySQL性能优化之 Nested Loop Join和Block Nested-Loop Join(BNL)
转自http://blog.itpub.net/22664653/viewspace-1692317/ 一 介绍 相信许多开发/DBA在使用MySQL的过程中,对于MySQL处理多表关联的方式或者说 ...
- Ubuntu 14.04.1 建立 Android M, Android N 開發環境 與 問題
# Modify /etc/apt/sources.list# add below 3 lines to /etc/apt/sources.listdeb http://archive.ubuntu. ...