带有复选框的 Android 联系人选择器
Posted
技术标签:
【中文标题】带有复选框的 Android 联系人选择器【英文标题】:Android Contact Picker With Checkbox 【发布时间】:2012-09-06 22:45:19 【问题描述】:有很多关于同一主题的讨论,但在这里花了 4 小时后,我找不到有效的描述或链接来制作带有复选框的联系人选择器。
我有一个带有 DONE 按钮和 listview
带有 checkbox
的活动。我设法正确显示了联系人。现在我想在bundle
中返回选定的联系电话号码(我认为最好的方法),以便我可以在onActivityResult()
中获取号码列表。我不确定我遵循的方式是否正确。
这是我的代码:
public class ContactPickerMulti extends ListActivity implements OnClickListener
// List variables
public String[] Contacts = ;
public int[] to = ;
public ListView myListView;
Button save_button;
private TextView phone;
private String phoneNumber;
private Cursor cursor;
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.contacts_multi);
// Initializing the buttons according to their ID
save_button = (Button) findViewById(R.id.contact_done);
// Defines listeners for the buttons
save_button.setOnClickListener(this);
Cursor mCursor = getContacts();
startManagingCursor(mCursor);
ListAdapter adapter = new SimpleCursorAdapter(
this,
android.R.layout.simple_list_item_multiple_choice,
mCursor,
Contacts = new String[] ContactsContract.Contacts.DISPLAY_NAME ,
to = new int[] android.R.id.text1 );
setListAdapter(adapter);
myListView = getListView();
myListView.setItemsCanFocus(false);
myListView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
private Cursor getContacts()
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME ;
String selection = ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '"
+ ("1") + "'";
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";
return managedQuery(uri, projection, selection, selectionArgs,
sortOrder);
public void onClick(View src)
Intent i;
switch (src.getId())
case R.id.contact_done:
SparseBooleanArray selectedPositions = myListView
.getCheckedItemPositions();
SparseBooleanArray checkedPositions = myListView
.getCheckedItemPositions();
if (checkedPositions != null)
for (int k = 0; k < checkedPositions.size(); k++)
if (checkedPositions.valueAt(k))
String name =
((Cursor)myListView.getAdapter().getItem(k)).getString(1);
Log.i("XXXX",name + " was selected");
break;
我想将数字作为数组或列表发送。做这个的最好方式是什么?非常感谢任何帮助或通往正确道路的帮助。
【问题讨论】:
请添加适配器代码,以便我知道您如何获得 phoneNumber。 @Yul 代码已更新..现在它将打印联系人的姓名 :) 我只需要获取电话号码而不是姓名 ;) 完成! 【参考方案1】:我在onClick
使用这个代码:
long[] id = getListView().getCheckedItemIds();// i get the checked contact_id instead of position
phoneNumber = new String[id.length];
for (int i = 0; i < id.length; i++)
phoneNumber[i] = getPhoneNumber(id[i]); // get phonenumber from selected id
Intent pickContactIntent = new Intent();
pickContactIntent.putExtra("PICK_CONTACT", phoneNumber);// Add checked phonenumber in intent and finish current activity.
setResult(RESULT_OK, pickContactIntent);
finish();
//
private String getPhoneNumber(long id)
String phone = null;
Cursor phonesCursor = null;
phonesCursor = queryPhoneNumbers(id);
if (phonesCursor == null || phonesCursor.getCount() == 0)
// No valid number
signalError();
return null;
else if (phonesCursor.getCount() == 1)
// only one number, call it.
phone = phonesCursor.getString(phonesCursor
.getColumnIndex(Phone.NUMBER));
else
phonesCursor.moveToPosition(-1);
while (phonesCursor.moveToNext())
// Found super primary, call it.
phone = phonesCursor.getString(phonesCursor
.getColumnIndex(Phone.NUMBER));
break;
return phone;
private Cursor queryPhoneNumbers(long contactId)
ContentResolver cr = getContentResolver();
Uri baseUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,
contactId);
Uri dataUri = Uri.withAppendedPath(baseUri,
ContactsContract.Contacts.Data.CONTENT_DIRECTORY);
Cursor c = cr.query(dataUri, new String[] Phone._ID, Phone.NUMBER,
Phone.IS_SUPER_PRIMARY, RawContacts.ACCOUNT_TYPE, Phone.TYPE,
Phone.LABEL , Data.MIMETYPE + "=?",
new String[] Phone.CONTENT_ITEM_TYPE , null);
if (c != null && c.moveToFirst())
return c;
return null;
以及您开始的活动的最后一个onActivityResult
PickContactsActivity
// TODO Auto-generated method stub
// super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK)
if (requestCode == Constants.REQUEST_CODE_PICK_CONTACT)
if (data != null)
String[] temp = data.getStringArrayExtra("PICK_CONTACT");
【讨论】:
感谢您的回复。非常感谢。顺便说一句,我有错误,phonesCursor = queryPhoneNumbers(id);
queryPhoneNumbers(id);
中我应该做什么@
这是您在onClick
getPhoneNumber(id[i]);
中获得的已检查联系人的ID。我将此代码用于我的应用程序,因此我保证它运行。所以你只需要改变一点以适应你的需求
我完全迷路了,这是我当前的代码pastebin.com/tdTpFR6t 你能看一下吗?
可以发一下queryPhoneNumbers(id);
的方法吗?
编辑我的帖子。对不起复制错误所以它加倍getPhoneNumber
方法【参考方案2】:
在newActivity
中使用startActivityForResult(newActivity)
时,您必须先调用setResult(RESULT_OK)
,然后调用finish()
以关闭Activity
。您可以选择在对setResult(RESULT_OK, intent)
的调用中包含Intent
。对setResult()
的调用将导致调用onActivityResult()
的实现,您可以在其中处理Activity
的结果。因此,在您的情况下,您只需创建一个 Intenet
并使用 putExtra()
方法之一将您的数组列表添加到其中。然后Intent
将被传递给onActivityResult()
,您可以在其中提取该信息。请参阅Intent 和Activity 了解更多信息。
【讨论】:
感谢您的回复。我已经更新了代码,现在我可以获得选中的项目位置。那么如何获取联系方式呢?我的意思是我只有项目位置,我如何查询来制作 LIST?有什么想法吗? 你可以得到任何类型的数据,那么问题出在哪里?放一个 ArrayList 什么的就行了。以上是关于带有复选框的 Android 联系人选择器的主要内容,如果未能解决你的问题,请参考以下文章