android源码追踪学习 RecipientsEditor
RecipientsEditor 新建短信时输入收接者的editor,
- public class RecipientsEditor extends MultiAutoCompleteTextView {
- private int mLongPressedPosition = -1;
- private final RecipientsEditorTokenizer mTokenizer;
- private char mLastSeparator = ',';
- public RecipientsEditor(Context context, AttributeSet attrs) {
- super(context, attrs, android.R.attr.autoCompleteTextViewStyle);
- mTokenizer = new RecipientsEditorTokenizer(context, this);
- setTokenizer(mTokenizer);
- // For the focus to move to the message body when soft Next is pressed
- setImeOptions(EditorInfo.IME_ACTION_NEXT);
- // Set threshold as 1 CharSequence.
- setThreshold(1);
- addTextChangedListener(new TextWatcher() {
- private Annotation[] mAffected;
- public void beforeTextChanged(CharSequence s, int start,
- int count, int after) {
- mAffected = ((Spanned) s).getSpans(start, start + count,
- Annotation.class);
- }
- public void onTextChanged(CharSequence s, int start,
- int before, int after) {
- if (before == 0 && after == 1) { // inserting a character
- char c = s.charAt(start);
- if (c == ',' || c == ';') {
- // Remember the delimiter the user typed to end this recipient. We'll
- // need it shortly in terminateToken().
- mLastSeparator = c;
- }
- }
- }
- public void afterTextChanged(Editable s) {
- if (mAffected != null) {
- for (Annotation a : mAffected) {
- s.removeSpan(a);
- }
- }
- mAffected = null;
- }
- });
- }
RecipientsEditor 继承于 MultiAutoCompleteTextView
可支持输入多个手机号码,每个手机号码用用分隔符分开,有自动完成功能,预置匹配的数据为联系人;
其中RecipientsEditorTokenizer为了找出输入字符串中的分隔符","和“,”
- private class RecipientsEditorTokenizer
- implements MultiAutoCompleteTextView.Tokenizer {
- private final MultiAutoCompleteTextView mList;
- private final Context mContext;
- RecipientsEditorTokenizer(Context context, MultiAutoCompleteTextView list) {
- mList = list;
- mContext = context;
- }
- public int findTokenStart(CharSequence text, int cursor) {
- int i = cursor;
- char c;
- while (i > 0 && (c = text.charAt(i - 1)) != ',' && c != ';') {
- i--;
- }
- while (i < cursor && text.charAt(i) == ' ') {
- i++;
- }
- return i;
- }
- public int findTokenEnd(CharSequence text, int cursor) {
- int i = cursor;
- int len = text.length();
- char c;
- while (i < len) {
- if ((c = text.charAt(i)) == ',' || c == ';') {
- return i;
- } else {
- i++;
- }
- }
- return len;
- }
- public CharSequence terminateToken(CharSequence text) {
- int i = text.length();
- while (i > 0 && text.charAt(i - 1) == ' ') {
- i--;
- }
- char c;
- if (i > 0 && ((c = text.charAt(i - 1)) == ',' || c == ';')) {
- return text;
- } else {
- // Use the same delimiter the user just typed.
- // This lets them have a mixture of commas and semicolons in their list.
- String separator = mLastSeparator + " ";
- if (text instanceof Spanned) {
- SpannableString sp = new SpannableString(text + separator);
- TextUtils.copySpansFrom((Spanned) text, 0, text.length(),
- Object.class, sp, 0);
- return sp;
- } else {
- return text + separator;
- }
- }
- }
setImeOptions(EditorInfo.IME_ACTION_NEXT);//设置软键盘右下角的button的功能为下一个,即切换到下一个输入框,如果设置成EditorInfo.IME_ACTION_DONE,则表示输入完成,关掉软键盘,还有很多其他的选项可供设置的
setThreshold(1);// Threshold门槛的意思,此处设置只要输入一个字符就开始匹配,若设置为“2”则表示要输入两个字符才是匹配。
addTextChangedListener(TextWatcher);//添加一个TextView监听器
TextWatcher里有三个回调方法,当有输入框里的字符有变化时会自动依次调用以下三个方法:
beforeTextChanged(CharSequence s, int start,int count, int after) ;
//此处已输入为例解释上面各变量的意思,s 是输入以前的字符串,start光标所在的位置, count为要改变的字符个数,即选中的个数,after为要插入的个数
onTextChanged(CharSequence s, int start, int before, int after)
//s为改变后的字符串,start和上面的start一样, before和上面的count一样,after与上面的after一样
afterTextChanged(Editable s)// s为改变后的字符串
预制匹配数据为联系人的方法是通过设置适配器:
- mRecipientsEditor.setAdapter(new RecipientsAdapter(this));
RecipientsAdapter 是extends ResourceCursorAdapter的
在适配器里面通过Phone.CONTENT_FILTER_URI,获取电话本里的信息。
android源码追踪学习 RecipientsEditor的更多相关文章
- Android源码-学习随笔
在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...
- Android学习系列(38)--Android源码下载和编译
前面多篇文章介绍到如何下载和编译Android或者CM源码,不过一直都是放在<拓展系列>里.随着学习的深入,android源码是非常有参考和学习价值,强烈推荐大家都去下载,编译,学习,所以 ...
- (转)Android学习进阶路线导航线路(Android源码分享)
转载请注明出处:http://blog.csdn.net/qinjuning 前言:公司最近来了很多应届实习生,看着他们充满信心但略带稚气的脸庞上,想到了去年的自己,那是的我是不是也和 现在的他们一 ...
- Android源码学习之装饰模式应用
首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...
- 《Android源码设计模式》学习笔记之ImageLoader
微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...
- Android学习进阶路线导航线路(Android源码分享)
转 ...
- Android源码学习之模板方法模式应用
一.模板方法模式定义 模板方法模式定义: defines the skeleton of an algorithm in a method, deferring some steps to subcl ...
- 【Linux/Ubuntu学习6】unbuntu 下载android源码
在Windows下安装Cygwin,通过Cygwin也可在Windows里通过本文的下载步骤下载Android源码. 以下为在Ubuntu下下载Google Android4.4源码的步骤: 1. 安 ...
- Android源码学习(一) 数据集观察者
查看Android源码发现这个,决定记下下来. 1.在android.database这个包下面,存在这样一个抽象类DataSetObserver,里面包括onChanged()和onInvalida ...
随机推荐
- hdu 2795 Billboard 线段树+二分
Billboard Time Limit: 20000/8000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Probl ...
- Selenium 对元素element的操作举例
前三个用的比较多,模拟用户操作最多的就是点击,输入文本,其他的UI自动化测试中涉及的不多,对判断元素是否存在,断言元素是否被选中,元素被选中后CSS属性是否更改等,还是很有必要的.
- 使用 rlist 包处理嵌套数据结构
在前面的章节中,我们已经学习了存储表的关系型数据库,支持嵌套数据结构的非关系型数据库.在 R 中,最常见的嵌套数据结构就是列表对象.之前的章节都关注操作表格数据.本节,我们一起玩转作者开发的 rlis ...
- [设计模式][c++]状态切换模式
转自:http://blog.csdn.net/yongh701/article/details/49154439 状态模式也是设计模式的一种,这种设计模式思想不复杂,就是实现起来的代码有点复杂.主要 ...
- spring boot 邮件发送(带附件)
首先开启QQ邮箱的POP.SMTP服务器,获取授权码. 设置-->账户-->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务 pom.xml需要加载三个ja ...
- RetinaNet论文理解
引言 介绍 目前精度高的检测器都是基于two-stage,proposal-driven机制,第一阶段生成稀疏的候选对象位置集,第二阶段使用CNN进一步将每个候选位置分为前景或者背景以及确定其类别: ...
- threejs和particles.js
particles.js 在线配置的东西: http://vincentgarreau.com/particles.js/ https://threejs.org/ http://thehuub.co ...
- 监督学习--k近邻算法
2017-07-20 15:18:25 k近邻(k-Nearest Neighbour, 简称kNN)学习是一种常用的监督学习方法,其工作机制非常简单,对某个给定的测试样本,基于某种距离度量找出训练集 ...
- [ORA-28001: the password has expired]的处理
http://irikintwtr.com/wordpress/?p=420 alter profile default limit password_life_time unlimited; alt ...
- English trip V1 - 2.Don't Do That Teacher:Patrick Key: 祈使句(imperatives)
什么是祈使句? What's imperatives? 求或者希望别人做什么事或者不做什么事时用的句子:带有命令的语气 In this lesson you will learn how to ...