我在想:
是否可以自定义Android联系人选择器,以便它还可以允许在默认联系人列表中添加新联系人作为菜单选项?
目前,如果我从我的活动中调用联系人选择器,它只显示默认联系人列表。我还希望用户能够创建新联系人(如果它尚不存在)。我已经搜索了很多但是没有找到合适的API来执行此操作。就我所见,ContactContract
中没有任何内容。
任何输入都将受到赞赏。我有一个HTC的感觉,在编写短信的消息应用程序中,弹出的联系人选择器有一个搜索栏,联系人列表和选项菜单,你可以选择添加新的联系人。这是如何实现的?
答案 0 :(得分:4)
我理解你的问题,不,这是不可能的。这是因为Android联系人框架将添加和选择视为逻辑上不同的操作,应该使用不同的意图启动。如果您使用意图Intent.ACTION_PICK
启动联系人选择器,您将看到一个特定于选择器的联系人UI版本,其中包含所有内容(例如,添加或删除联系人),这与此操作无关。
要查看无法解决的原因,请在ContactsListActivity
中查看股票联系人应用的代码。根据启动活动的意图,它可能是代码中定义的几种“模式”之一,它控制UI如何呈现自身以及允许哪些行为。如果你查看活动的onCreate()方法,你会看到:
(N.B。我正在查看GrepCode上的Android 2.3.7源代码)
mMode = MODE_UNKNOWN;
if (UI.LIST_DEFAULT.equals(action) || UI.FILTER_CONTACTS_ACTION.equals(action)) {
mMode = MODE_DEFAULT;
[...]
} else if (Intent.ACTION_PICK.equals(action)) {
// XXX These should be showing the data from the URI given in
// the Intent.
final String type = intent.resolveType(this);
if (Contacts.CONTENT_TYPE.equals(type)) {
mMode = MODE_PICK_CONTACT;
}
[...]
所以我们看到意图Intent.ACTION_PICK
,UI被置于“选择器”模式。然后再往下看:
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// If Contacts was invoked by another Activity simply as a way of
// picking a contact, don't show the options menu
if ((mMode & MODE_MASK_PICKER) == MODE_MASK_PICKER) {
return false;
}
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.list, menu);
return true;
}
这就是为什么当您启动联系人选择器时没有选项菜单的原因 - 用户界面选择以某种方式呈现自己,因为您在启动选择器时的意图,即仅选择。
如果您要执行的操作是添加联系人,则需要启动具有不同意图的联系人,尤其是Intent.ACTION_INSERT_OR_EDIT
。 (在onCreate()中,您将看到类似于上面的部分,如果收到此意图,活动的模式将设置为“添加/编辑”值。)