【问题标题】:Android Contact PickerAndroid 联系人选择器
【发布时间】:2011-11-26 00:19:46
【问题描述】:

我想知道:

是否可以自定义 Android 联系人选取器,以便它还可以允许将新联系人添加为默认联系人列表中的菜单选项?

目前,如果我从我的活动中调用联系人选择器,它只会显示默认联系人列表。如果新联系人不存在,我还希望用户能够创建新联系人。我已经对此进行了很多搜索,但没有找到合适的 API 来执行此操作。据我所知,ContactContract 中没有任何内容。


我们将不胜感激。我有一种 HTC 的感觉,在编写短信时,在消息传递应用程序中,弹出的联系人选择器有一个搜索栏、联系人列表,在选项菜单中,您可以选择添加新联系人。这是如何实现的?

【问题讨论】:

标签: android-contacts


【解决方案1】:

据我了解您的问题,不,这是不可能的。这是因为 Android 联系人框架将添加和选择视为逻辑上不同的操作,应该以不同的意图启动。如果您使用意图 Intent.ACTION_PICK 启动联系人选择器,您将看到联系人 UI 的选择器特定版本,其中包含与此操作无关的所有内容(例如添加或删除联系人)。

要了解为什么不能这样做,请查看股票联系人应用程序的代码,地址为 ContactsListActivity。根据启动活动的意图,它可能处于代码中定义的几种“模式”之一,这些“模式”控制 UI 如何呈现自身以及允许哪些行为。如果您查看活动的 onCreate() 方法,您会看到:

(注意,我正在查看 Android 2.3.7 源代码,地址为 GrepCode)

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

这就是为什么在您启动联系人选择器时没有选项菜单的原因 - UI 选择以某种方式呈现自己,因为您在启动选择器时的假定意图是,即仅选择。

如果您想要添加一个联系人,您需要以不同的意图启动联系人,特别是 Intent.ACTION_INSERT_OR_EDIT。 (在 onCreate() 中,您将看到与上面类似的部分,如果收到此意图,则将活动的模式设置为“添加/编辑”值。)

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-05
    • 2017-05-10
    • 2015-06-20
    相关资源
    最近更新 更多