@好友的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 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
随机推荐
- 使用axis2 soapmonitor监控soap数据
Using the SOAP Monitor SOAPMonitor使用 使用SOAPMonitor axis2开发笔记-消息监控 WebService大讲堂之Axis2(10):使用soapmoni ...
- Js 遍历json对象所有key及根据动态key获取值
var obj = {}; for(var k in obj) { //遍历对象,k即为key,obj[k]为当前k对应的值 console.log(obj[k]); } 文章来自:https://z ...
- [Leetcode] Course Schedule
There are a total of n courses you have to take, labeled from 0 to n - 1. Some courses may have prer ...
- 谈谈计算机上的那些存储器-Memory Hierarchy
文章首发于浩瀚先森博客http://www.guohao1206.com/2016/12/07/1248.html 说到计算机上的存储器,很多人第一反应是硬盘,然后是内存. 其实在计算机上除了硬盘和内 ...
- python实现计算器
计算器功能 实现优先级解析,加减乘除四则运算 自定义小数位精度 实现思想: 先找到最里层括号,根据乘除,加减优先级,调用写好的乘除.加减运算函数算出括号内总值,再将原括号式用所得值替换,此过程循环进行 ...
- ASP.NET Identity 简介
翻译自:http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity ,略有改动. 背景:A ...
- ubuntu下配置vpn
Ubuntu系统下搭建VPN环境 以下是基于Amazon EC2/Ubuntu搭建PPTPD服务提供VPN连接的过程记录.至于为什么要搞VPN,大家都懂的...而我主要是要访问Python的一些网站以 ...
- 线性回归 Linear Regression
成本函数(cost function)也叫损失函数(loss function),用来定义模型与观测值的误差.模型预测的价格与训练集数据的差异称为残差(residuals)或训练误差(test err ...
- matlab进阶:常用功能的实现,常用函数的说明
常用功能的实现 获取当前脚本所在目录 current_script_dir = fileparts(mfilename('fullpath')); % 结尾不带'/' 常用函数的说明 bsxfun m ...
- svn清理失败且路径显示乱码
1.下载 sqlite数据库工具,sqlite3.exe下载地址:sqlite官网http://www.sqlite.org/download.html,我这里是windows操作系统,因此下载 Pr ...