android源码追踪学习 RecipientsEditor
2013-04-12 17:30
190 查看
RecipientsEditor 新建短信时输入收接者的editor,
RecipientsEditor 继承于 MultiAutoCompleteTextView
可支持输入多个手机号码,每个手机号码用用分隔符分开,有自动完成功能,预置匹配的数据为联系人;
![](http://img.my.csdn.net/uploads/201304/12/1365750677_7888.JPG)
其中RecipientsEditorTokenizer为了找出输入字符串中的分隔符","和“,”
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为改变后的字符串
预制匹配数据为联系人的方法是通过设置适配器:
在适配器里面通过Phone.CONTENT_FILTER_URI,获取电话本里的信息。
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源码追踪学习 RecipientsEditor
- Android 界面滑动实现---Scroller类 从源码和开发文档中学习(让你的布局动起来)
- Android系统源码学习步骤
- 我是如何学习Android源码的
- Android级连异步任务——Bolts-Android源码简单学习(二)
- Android源码学习(2) Handler之Looper
- 看源码学习Android之AdapterView的convertView
- Linphone-Android源码学习(二、LinphoneLauncherActivity)
- Android源码学习笔记-Android系统框架
- 广师Android群分享集合之Android源码学习
- Android源码解析之广播(Broadcast)机制简要介绍和学习计划
- android 学习之 EventBus 源码初析
- Android源码学习之如何使用eclipse+NDK【一】
- Android-SharedPreferences源码学习与最佳实践
- Android系统源码学习-SIM卡(三) Android 4.2中与SIM/USIM 管理流程
- Android2.1消息应用(Messaging)源码学习笔记
- Android FM模块学习之四源码学习(2)
- android源码学习-事件分发处理机制
- 【Android源码学习】View的layout和draw流程