6

同じ主題について多くの議論が行われていますが、ここで 4 時間を費やした後、有効な説明やチェックボックス付きの連絡先ピッカーを作成するためのリンクを見つけることができませんでした.

DONEボタンとlistviewを使用したアクティビティがありますcheckbox。連絡先を正しく表示することができました。ここで、選択した連絡先の電話番号を a で返したい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;
        }

    }
}

数値を配列またはリストとして送信したい。これを行う最善の方法は何ですか?助けや正しい道への導きは高く評価されます。

4

2 に答える 2

4

私はこのコードを次のように使用します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");

            }
        }

    }

}
于 2012-09-14T12:53:43.063 に答える
2

で使用startActivityForResult(newActivity)するnewActivity場合は、 を呼び出したsetResult(RESULT_OK)後にfinish()を閉じる必要がありますActivityIntentオプションで、 への呼び出しに を含めることができますsetResult(RESULT_OK, intent)。を呼び出すと、 の結果を処理できる場所setResult()の実装が呼び出されます。したがって、あなたの場合、メソッドの1つを使用して配列リストを作成し、それに追加するだけです。それは、その情報を抽出できる場所に渡されます。詳細については、インテントアクティビティを参照してください。onActivityResult()ActivityIntenetputExtra()IntentonActivityResult()

于 2012-09-13T19:42:13.933 に答える