2012-09-13 34 views
6

Aynı konu hakkında birçok tartışma var, ancak burada 4 saat geçirdikten sonra Checkbox ile İletişim Seçici yapmak için geçerli bir açıklama veya bağlantı bulamadım.Android İletişim Seçici ile Onay Kutusu

Ben YAPILAN düğmesi ve checkbox ile listview ile bir aktiviteye sahiptir. Kişileri doğru şekilde göstermeyi başardım. Şimdi bundle numaralı telefondan seçilen iletişim telefon numaralarını geri getirmek istiyorum (en iyi şekilde düşünüyorum) böylece onActivityResult() numaralarının listesini alabilirim. İzlediğim yolun doğru olup olmadığından emin değilim. Ben dizi veya liste olarak numaralar göndermek istediğiniz

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

    } 
} 

:

İşte benim kodudur. Bunu yapmanın en iyi yolu nedir? Herhangi bir yardım veya doğru yola giden yol çok takdir edilmektedir.

+0

böylece adaptör kodu ı edebilirsiniz ekleyiniz başlangıç ​​etkinliğinin son onActivityResult telefon numaranı bil. –

+0

@Yul kodu güncellendi .. Şimdi kişinin adını yazdıracak :) Sadece İsim yerine telefon numarasını almalıyım;) Bitti! Cevabınız için –

cevap

3

ben onClick bu kodu kullanın:

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

Ve 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"); 

      } 
     } 

    } 

} 
+0

Cevabınız için teşekkür ederiz. Çok teşekkürler. ne queryPhoneNumbers (id) 'yapmanız gereken gerektiğini';; BTW, 'phonesCursor = queryPhoneNumbers (id) hataları yaşıyorum Elindeki kontrol temas id' –

+0

in'onClick' 'getPhoneNumber (id [i]). Uygulamam için bu kodu kullanıyorum, bu yüzden çalışmamızı temin ederim. Benim geçerli kod http://pastebin.com/tdTpFR6t sen ona bir göz alabilir miyim olduğu Yani sadece burada, biraz seninkini Ben toplam yerde kayboldum –

+0

uyacak şekilde değiştirmek zorunda? –

2

yılında startActivityForResult(newActivity) kullanarak newActivity sen Activity kapatmak için finish() ardından setResult(RESULT_OK) için bir çağrı yapmak zorundadır. İsteğe bağlı olarak Intent aramasını setResult(RESULT_OK, intent) aramasına ekleyebilirsiniz. setResult() numaralı çağrı, Activity'un sonucunu işleyebileceğiniz, onActivityResult() uygulamanızı çağırmanıza yol açacaktır. Bu durumda, bir Intenet oluşturmak ve dizi listenizi putExtra() yöntemlerinden birini kullanarak ekleyin. Bu Intent, daha sonra bu bilgileri ayıklayabileceğiniz onActivityResult()'a geçirilecektir. Daha fazla bilgi için bkz. Intent ve Activity.

+0

teşekkürler. Kodu güncelledim ve şimdi kontrol edilen madde pozisyonunu alabilirim. Peki iletişim bilgilerini nasıl alabilirim? Demek istediğim sadece madde pozisyonum var ve LIST’i yapmak için nasıl sorgu yapabilirim? Herhangi bir fikir? –

+0

Her türlü veriyi alabilirsiniz, bu yüzden sorun nerede? Sadece bir ArrayList ya da bir şey koy. –

İlgili konular