@好友的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 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...
随机推荐
- NSBundle
属性: .使用类方法创建一个NSBundler对象 + (NSBundle *)mainBundle; eg:[NSBundle mailBundle]; .使用路径获取一个NSBundle 对象,这 ...
- One EEG preprocessing pipeline - EEG-fMRI paradigm
The preprocessing pipeline of EEG data from EEG-fMRI paradigm differs from that of regular EEG data, ...
- [转载]jQuery中wrap、wrapAll和wrapInner用法以及区别
原文地址:jQuery中wrap.wrapAll和wrapInner用法以及区别作者:伊少君 原文: <ul> <li title='苹果'>苹果</li> ...
- 微信小程序之登录态维护(十一)
[未经作者本人同意,请勿以任何形式转载] >什么是登录态? 所谓登录态,就是程序在运行时,能够识别当前用户,能够证明自己的唯一性且合法. 我们知道,WEB服务器通过浏览器携带的cookie获取s ...
- [LintCode] Longest Increasing Subsequence 最长递增子序列
Given a sequence of integers, find the longest increasing subsequence (LIS). You code should return ...
- 【Jquery】$.Deferred 对象
源:http://www.ruanyifeng.com/ deferred三个状态 “已完成”“未完成”“已失败” (1) $.Deferred() 生成一个deferred对象. ...
- iis虚拟目录名称“ReportServer”的巧合
今天测试一个Crystal Report网站的报表服务,建立一个虚拟目录,名为ReportServer,结果无论怎样访问浏览器都返回 localhost/ReportServer - / Micr ...
- wcf测试证书的创建
如何创建证书: makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=JiangServer -sky exchange -pe (服务端证书) ...
- android开发之线程
线程(android) 在java中我们学习了线程,线程,是进程的一个单位,在程序要运行时,会开启线程,运行程序,我们要创建线程就需要我们去继承接口Thread或者实现Runabl ...
- Java基础-重写方法
一般我们需要在新类上重写,两个类的实现: class Animal{ public void move(){ System.out.println("动物可以移动"); } } c ...