1.保存一个“+8618621058121”号码的联系人"Jane"
2.保存一个号码是“42266888”的联系人“1”
3.信息-新建信息-在联系人输入框中输入“+86”-输入“1”-点击删除按钮
【测试结果】联系人变为1
【预期结果】联系人应为"Jane"
与问题相关的类为Mms下的ComposeMessageActivity,相关控件为在initRecipientsEditor()方法中初始化的mRecipientsEditor,所对应的控件为RecipientsEditor;这里简单介绍下RecipientsEditor-接收者编辑器的实现方法:
一条信息可以发送给1到多个目标用户——它们被称为“接收者”,以电话号码、E-Mail地址等形式存在。“接收者”通常是从“联系人应用”中选择或由用户直接输入。
在Messaging应用中,用于输入接收者的控件有独立实现——RecipientsEditor,它继承自MultiAutoCompleteTextView,我们知道AutoCompleteTextView组件提供了输入时推荐可选项的功能,而Multi...则意为着可输入多个项目(各项目间以逗号分隔),并分别推荐可选项。
推荐选项的数据源来自RecipientsAdapter适配器,它从ContactsProvider中读取MOBILE,WORK_MOBILE,MMS三种类型的电话号码作为推荐选项,在用户输入时自动匹配并推荐。
说起接收者我们就不得不讨论Contact(代表接收者)、ContactList(代表接收者列表)两个重要的类,他们提供了常用的组织联系人基本信息的方法,非常易于使用,同时它们也涉及到Cache缓存系统。
由于时间原因这里只是给出做出的改动:
ChipsRecipientAdapter类下的构造方法ChipsRecipientAdapter():
public ChipsRecipientAdapter(Context context) {
// The Chips UI is email-centric by default. By setting QUERY_TYPE_PHONE, the chips UI
// will operate with phone numbers instead of emails.
//The Chips UI is phone and email
//super(context, DEFAULT_PREFERRED_MAX_RESULT_COUNT, QUERY_TYPE_EMAIL_AND_PHONE);
super(context, DEFAULT_PREFERRED_MAX_RESULT_COUNT, QUERY_TYPE_PHONE);
}
Queries类下:
/**
* Phone and Email queries for supporting Chips UI.
*/
/* package */ class Queries {
public static final Query PHONE = new Query(new String[] {
Contacts.DISPLAY_NAME, // 0
Phone.NUMBER, // 1
Phone.TYPE, // 2
Phone.LABEL, // 3
Phone.CONTACT_ID, // 4
Phone._ID, // 5
Contacts.PHOTO_THUMBNAIL_URI,// 6
Contacts.DISPLAY_NAME_SOURCE // 7
//}, Phone.CONTENT_FILTER_URI, Phone.CONTENT_URI) {
}, Phone.CONTENT_FILTER_URI, PhoneAndEmail.CONTENT_URI) {
@Override
public CharSequence getTypeLabel(Resources res, int type, CharSequence label) {
return Phone.getTypeLabel(res, type, label);
}
};
如此,问题解决;(添加注释红色背景的为修改前代码)
解决新建短信时,输入“+86”,然后输入联系人名字“1”,按删除键之后,联系人变为“1”,删除操作为达到预期结果