类似微信聊天中的@好友功能,封装到一个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的更多相关文章

  1. Android中使用ExpandableListView实现好友分组

    一个视图显示垂直滚动两级列表中的条目.这不同于列表视图,允许两个层次,类似于QQ的好友分组.要实现这个效果的整体思路为: 1.要给ExpandableListView 设置适配器,那么必须先设置数据源 ...

  2. Android ListView用EditText实现搜索功能

    前言 最近在开发一个IM项目的时候有一个需求就是,好友搜索功能.即在EditText中输入好友名字,ListView列表中动态展示刷选的好友列表.我把这个功能抽取出来了,先贴一下效果图: 分析 在查阅 ...

  3. 【Android 界面效果12】EditText中的多行输入问题

    ------- 源自梦想.永远是你IT事业的好友.只是勇敢地说出我学到! ---------- 我们在使用EditText进行多行输入的时候,通常的写法如下: <EditText android ...

  4. Android学习--------实现增删改查数据库操作以及实现相似微信好友对话管理操作

    版权声明:本文为博主原创文章,转载请注明原文地址.谢谢~ https://blog.csdn.net/u011250851/article/details/26169409 近期的一个实验用到东西挺多 ...

  5. Android中集成QQ登陆和QQ好友分享及QQ空间分享

    extends : http://blog.csdn.net/arjinmc/article/details/38439957 相关官方文档及下载地址: 如果只用分享和登陆,用lite包就可以,体积小 ...

  6. EditText中禁止输入中文的方法

    应用场景 在Android应用中有时需要EditText中只允许输入约定的一些字符,禁止输入其他字符.这里列举了一些可能的应用场景. 1. 场景一 在通讯录保存好友信息界面中填写好友的电话号码时,应当 ...

  7. EditText中输入信息的限制的方法

    应用场景 在Android应用中有时需要EditText中只允许输入约定的一些字符,禁止输入其他字符.这里列举了一些可能的应用场景. 1. 场景一 在通讯录保存好友信息界面中填写好友的电话号码时,应当 ...

  8. Android:仿手机QQ好友动态的ListView

    1.介绍: 本博客使用XListView模仿Android版QQ好友动态的ListView效果.效果截图例如以下: 效果图1 watermark/2/text/aHR0cDovL2Jsb2cuY3Nk ...

  9. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

随机推荐

  1. BZOJ 2115 【Wc2011】 Xor

    Description Input 第一行包含两个整数N和 M, 表示该无向图中点的数目与边的数目. 接下来M 行描述 M 条边,每行三个整数Si,Ti ,Di,表示 Si 与Ti之间存在 一条权值为 ...

  2. js 运算符

    一.算术运算符: 1.运算符: “+”:功能:对数字进行代数求和:对字符串进行连接操作:将一个数值转换为字符串(数值+空字符串). “-”:功能:对操作数进行取反操作:对数字进行减法操作:将字符串转换 ...

  3. 恢复 Windows 7 的“回到父目录”按钮

    Windows 7 使用以来很多方面一直不习惯,特别是让我无比纠结的”回到父目录“ 按钮从资源管理器中消失了. 不能不说这是一个失败! 很多时候,Win 7 地址栏中自以为是的显示的很多层目录层次的面 ...

  4. JavaScript模板引擎artTemplate.js——为什么使用模板引擎?

    作为一个工作一年的菜鸟,在公司做了几个外包项目,也接触到了不同形式的web开发.其实也没多少,就是javaweb开发和HTML5移动开发,这两者在页面展示的时候的解决方案还是有所不同的. 1.vo+e ...

  5. iOS多线程的详情使用示例--简进祥

    大家都知道,在开发过程中应该尽可能减少用户等待时间,让程序尽可能快的完成运算.可是无论是哪种语言开发的程序最终往往转换成汇编语言进而解释成机器码来执行.但是机器码是按顺序执行的,一个复杂的多步操作只能 ...

  6. 动态树之LCT(link-cut tree)讲解

    动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...

  7. bzoj 4557: [JLoi2016]侦察守卫 树归

    bzoj 4557: [JLoi2016]侦察守卫 设f[x][j]表示覆盖以x为根的子树的所有应该被覆盖的节点,并且以x为根的子树向下j层全部被覆盖的最小代价. 设g[x][j]表示与x距离大于j全 ...

  8. 【BZOJ-2730】矿场搭建 Tarjan 双连通分量

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1602  Solved: 751[Submit][Statu ...

  9. top命令

    TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中C ...

  10. Examples of MIB Variables - SNMP Tutorial

    30.5 Examples of MIB Variables Versions 1 and 2 of SNMP each collected variables together in a singl ...