首页 > 代码库 > 解决新建短信时,输入“+86”,然后输入联系人名字“1”,按删除键之后,联系人变为“1”,删除操作为达到预期结果

解决新建短信时,输入“+86”,然后输入联系人名字“1”,按删除键之后,联系人变为“1”,删除操作为达到预期结果

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);
            }

    };

如此,问题解决;(添加注释红色背景的为修改前代码)