2010-05-18 8 views
15

mam ten kod:startActivityForResult i zamiarów Dodatki, wydaje dodatki nie są zepchnięte

Intent intent = new Intent(); 
     intent.setAction(Intent.ACTION_PICK); 
     intent.setData(ContactsContract.Contacts.CONTENT_URI); 
     intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag()); 
     startActivityForResult(intent, PICK_CONTACT); 

następnie odpowiedzi:

public void onActivityResult(int reqCode, int resultCode, Intent data) { 


     switch (reqCode) { 
      case (PICK_CONTACT): 
       if (resultCode == Activity.RESULT_OK) { 
        try { 
         Uri contactData = data.getData(); 
         String onlineid = data.getStringExtra(EXTRA_ONLINE_ID); 
        } catch (Exception e) { 
         e.printStackTrace(); 
        } 
       } 
       break; 
     } 
     super.onActivityResult(reqCode, resultCode, data); 
    } 

zmienna onlineid jest null. Jak mogę przekazać wartość, a następnie ją odebrać?

EDIT

Próbowałem nawet,

Bundle extras = data.getExtras(); // returns null 
+0

check ResultCode musi być -1 Activity.RESULT_OK – Jorgesys

+0

że jest w porządku , wchodzi w to, jeśli, ale dodatki są puste. – Pentium10

Odpowiedz

3

Dokonuje się tego według projektu; działania systemu nie odeślą dodatków, z którymi są wywoływani, więc musisz zarządzać danymi w innym miejscu.

Na szczęście parametr resultCode jest w pełni kontrolowany samodzielnie, co oznacza, że ​​można go użyć do zindeksowania danych.

private final int PICK_CONTACT = 0; 
private Bundle[] myDataTransfer = { null }; 

... 

Bundle myData = new Bundle(); 
myData.putString(EXTRA_ONLINE_ID, (String) v.getTag()); 
myDataTransfer[PICK_CONTACT] = myData; 
// create intent and all 
startActivityForResult(intent, PICK_CONTACT); 

... 

public void onActivityResult(int reqCode, int resultCode, Intent data) { 
    if (resultCode == PICK_CONTACT) { 
     Bundle myData = myDataTransfer[resultCode]; 
     String onlineid = myData.getString(EXTRA_ONLINE_ID); 
    } 
} 

nie jestem programista Java, musi być ładniejszy sposób zaimplementować mapę wiązek, ale to działa :)

+1

Po rozpoczęciu działania aktywność może zostać zabita. Więc indeks zniknie. Myślę, że musisz utrzymywać Pakiet gdzieś poza pamięcią Twojej aplikacji. – rumpel

+0

Aby dodać komentarz do @rumpel, możesz to sprawdzić, przechodząc do Ustawienia> Opcje programisty i włączając opcję "Nie wypełniaj działań". W ten sposób będziesz mógł przetestować ten przypadek i odkryje, że dane w myDataTransfer zostaną usunięte, chyba że zapiszesz/przywrócisz ręcznie w onSaveInstanceState – strangetimes

0

ok Sprawdź czy android aktywny: launchMode jest skonfigurowany jako SingleTask lub SingleInstance! to musi być problem :)

+0

To nie pomaga. – Pentium10

+0

Hi Pentium10, rozwiązałeś to? Myślę, że wszystko jest w porządku w twoim kodzie: S – Jorgesys

+1

Nie rozwiązałem. Uważam, że niestandardowe dodatki, które przekazujemy do tej innej działalności, nie zostały zachowane. – Pentium10

0

Wystąpiły również pewne problemy z tym.

Zamiast tej linii

intent.putExtra(EXTRA_ONLINE_ID, (String) v.getTag()); 

Spróbuj

intent.putExtra(EXTRA_ONLINE_ID, "" + v.getTag()); 
0

Pole EXTRA_ONLINE_ID będą musiały być ustawione w działania, które uruchomiono używając setResult. Jeśli nie ustawisz tej wartości w zwróconym celu (który jest inny niż wysłany), otrzymasz wartość pustą.

+0

Jak widać, korzysta z pliku ContactsContract.Contacts.CONTENT_URI, który nie jest częścią mojej podstawy kodu. – Pentium10

+0

Nic na to nie poradzę. Pytania brzmią: dlaczego chcesz zwrócić dane, które już posiadasz. – Abhinav

+0

Chcę, aby był zgodny z innym fragmentem kodu. – Pentium10

Powiązane problemy