RecipientsEditor 新建短信时输入收接者的editor,

  1. public class RecipientsEditor extends MultiAutoCompleteTextView {
  2. private int mLongPressedPosition = -1;
  3. private final RecipientsEditorTokenizer mTokenizer;
  4. private char mLastSeparator = ',';
  5. public RecipientsEditor(Context context, AttributeSet attrs) {
  6. super(context, attrs, android.R.attr.autoCompleteTextViewStyle);
  7. mTokenizer = new RecipientsEditorTokenizer(context, this);
  8. setTokenizer(mTokenizer);
  9. // For the focus to move to the message body when soft Next is pressed
  10. setImeOptions(EditorInfo.IME_ACTION_NEXT);
  11. // Set threshold as 1 CharSequence.
  12. setThreshold(1);
  13. addTextChangedListener(new TextWatcher() {
  14. private Annotation[] mAffected;
  15. public void beforeTextChanged(CharSequence s, int start,
  16. int count, int after) {
  17. mAffected = ((Spanned) s).getSpans(start, start + count,
  18. Annotation.class);
  19. }
  20. public void onTextChanged(CharSequence s, int start,
  21. int before, int after) {
  22. if (before == 0 && after == 1) {    // inserting a character
  23. char c = s.charAt(start);
  24. if (c == ',' || c == ';') {
  25. // Remember the delimiter the user typed to end this recipient. We'll
  26. // need it shortly in terminateToken().
  27. mLastSeparator = c;
  28. }
  29. }
  30. }
  31. public void afterTextChanged(Editable s) {
  32. if (mAffected != null) {
  33. for (Annotation a : mAffected) {
  34. s.removeSpan(a);
  35. }
  36. }
  37. mAffected = null;
  38. }
  39. });
  40. }

RecipientsEditor 继承于 MultiAutoCompleteTextView

可支持输入多个手机号码,每个手机号码用用分隔符分开,有自动完成功能,预置匹配的数据为联系人;

其中RecipientsEditorTokenizer为了找出输入字符串中的分隔符","和“,”

  1. private class RecipientsEditorTokenizer
  2. implements MultiAutoCompleteTextView.Tokenizer {
  3. private final MultiAutoCompleteTextView mList;
  4. private final Context mContext;
  5. RecipientsEditorTokenizer(Context context, MultiAutoCompleteTextView list) {
  6. mList = list;
  7. mContext = context;
  8. }
  9. public int findTokenStart(CharSequence text, int cursor) {
  10. int i = cursor;
  11. char c;
  12. while (i > 0 && (c = text.charAt(i - 1)) != ',' && c != ';') {
  13. i--;
  14. }
  15. while (i < cursor && text.charAt(i) == ' ') {
  16. i++;
  17. }
  18. return i;
  19. }
  20. public int findTokenEnd(CharSequence text, int cursor) {
  21. int i = cursor;
  22. int len = text.length();
  23. char c;
  24. while (i < len) {
  25. if ((c = text.charAt(i)) == ',' || c == ';') {
  26. return i;
  27. } else {
  28. i++;
  29. }
  30. }
  31. return len;
  32. }
  33. public CharSequence terminateToken(CharSequence text) {
  34. int i = text.length();
  35. while (i > 0 && text.charAt(i - 1) == ' ') {
  36. i--;
  37. }
  38. char c;
  39. if (i > 0 && ((c = text.charAt(i - 1)) == ',' || c == ';')) {
  40. return text;
  41. } else {
  42. // Use the same delimiter the user just typed.
  43. // This lets them have a mixture of commas and semicolons in their list.
  44. String separator = mLastSeparator + " ";
  45. if (text instanceof Spanned) {
  46. SpannableString sp = new SpannableString(text + separator);
  47. TextUtils.copySpansFrom((Spanned) text, 0, text.length(),
  48. Object.class, sp, 0);
  49. return sp;
  50. } else {
  51. return text + separator;
  52. }
  53. }
  54. }

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为改变后的字符串

预制匹配数据为联系人的方法是通过设置适配器:

  1. mRecipientsEditor.setAdapter(new RecipientsAdapter(this));

RecipientsAdapter 是extends ResourceCursorAdapter的

在适配器里面通过Phone.CONTENT_FILTER_URI,获取电话本里的信息。

android源码追踪学习 RecipientsEditor的更多相关文章

  1. Android源码-学习随笔

    在线代码网站1:http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/ 书籍: ...

  2. Android学习系列(38)--Android源码下载和编译

    前面多篇文章介绍到如何下载和编译Android或者CM源码,不过一直都是放在<拓展系列>里.随着学习的深入,android源码是非常有参考和学习价值,强烈推荐大家都去下载,编译,学习,所以 ...

  3. (转)Android学习进阶路线导航线路(Android源码分享)

     转载请注明出处:http://blog.csdn.net/qinjuning 前言:公司最近来了很多应届实习生,看着他们充满信心但略带稚气的脸庞上,想到了去年的自己,那是的我是不是也和 现在的他们一 ...

  4. Android源码学习之装饰模式应用

    首先得了解最基础的装饰器模式 参考 设计模式之八 --- 装饰模式(Decorator) 参考链接:http://blog.csdn.net/cjjky/article/details/7478788 ...

  5. 《Android源码设计模式》学习笔记之ImageLoader

    微信公众号:CodingAndroid cnblog:http://www.cnblogs.com/angel88/ CSDN:http://blog.csdn.net/xinpengfei521 需 ...

  6. Android学习进阶路线导航线路(Android源码分享)

                                                                                                       转 ...

  7. Android源码学习之模板方法模式应用

    一.模板方法模式定义 模板方法模式定义: defines the skeleton of an algorithm in a method, deferring some steps to subcl ...

  8. 【Linux/Ubuntu学习6】unbuntu 下载android源码

    在Windows下安装Cygwin,通过Cygwin也可在Windows里通过本文的下载步骤下载Android源码. 以下为在Ubuntu下下载Google Android4.4源码的步骤: 1. 安 ...

  9. Android源码学习(一) 数据集观察者

    查看Android源码发现这个,决定记下下来. 1.在android.database这个包下面,存在这样一个抽象类DataSetObserver,里面包括onChanged()和onInvalida ...

随机推荐

  1. 关于PATH_INFO

    nginx支持PATH_INFO? 想让nginx支持PATH_INFO,首先需要知道什么是pathinfo,为什么要用pathinfo? pathinfo不是nginx的功能,pathinfo是ph ...

  2. 项目中的一个分页功能pagination

    项目中的一个分页功能pagination <script> //总页数 ; ; //分页总数量 $(function () { // $("#pagination"). ...

  3. python input选择

    例1 import sys #声明字符串数组并初始化 newspaper=['1.北京晚报','2.作家文摘','3.参考消息', \ '4.证券报','5.不需要'] #字符串数组的输出 ): pr ...

  4. HTML中常见的其它标签

    HTML中常见的其它标签 一.头标签部分 1.<title>:指定浏览器的标题栏显示的内容. 2.<base>: href 属性:指定网页中所有的超链接的目录.可以是本地目录, ...

  5. Java基础九--抽象类

    Java基础九--抽象类 一.抽象类介绍 /*抽象类:抽象:笼统,模糊,看不懂!不具体. 特点:1,方法只有声明没有实现时,该方法就是抽象方法,需要被abstract修饰. 抽象方法必须定义在抽象类中 ...

  6. 1月10日 ruby基础教程,查漏补缺; 2月22日 Exception补充

    https://ruby-doc.org/core-2.5.0/Exception.html 1月20日练习完1,2章. 第一章 初探 ‘’单引号不执行转义符. \t 制表符.\n 换行符. p me ...

  7. Java基础-面向对象(08)

    面向过程 完成一个需求的步骤:首先是搞清楚我们要做什么,然后在分析怎么做,最后我们再代码体现.一步一步去实现,而具体的每一步都需要我们去实现和操作.这些步骤相互调用和协作,完成我们的需求.面向过程开发 ...

  8. 『PyTorch』第十弹_循环神经网络

    RNN基础: 『cs231n』作业3问题1选讲_通过代码理解RNN&图像标注训练 TensorFlow RNN: 『TensotFlow』基础RNN网络分类问题 『TensotFlow』基础R ...

  9. 字符串 dfs

    1222: FJ的字符串 [水题] 时间限制: 1 Sec 内存限制: 128 MB 提交: 52 解决: 9 状态 题目描述 FJ在沙盘上写了这样一些字符串: A1  =  “A” A2  =  “ ...

  10. UVA-10061 How many zero's and how many digits ? (数论)

    题目大意:让求n!在base进制下的位数以及末尾0的连续个数. 题目分析:一个m位的b进制数N,最小是b^(m-1),最大不超过b^m,即b^(m-1)≤N<b^m.解不等式,得log10(N) ...