2010-05-18 2 views
15

J'ai ce code:startActivityForResult et Intentions Extras, il semble extras ne sont pas repoussé

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

ensuite sur la réponse:

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

la variable onlineid est nulle. Comment puis-je transmettre une valeur puis la récupérer?

EDIT

J'ai même essayé,

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

chèque resultCode doit être -1 pour Activity.RESULT_OK – Jorgesys

+0

qui est bien , ça devient ça si, mais les Extras sont vides. – Pentium10

Répondre

3

Ceci est fait par conception; les activités du système ne renverront pas les extras avec lesquels ils sont appelés, vous devez donc gérer les données ailleurs. Heureusement, le paramètre resultCode est entièrement contrôlé par vous-même, ce qui signifie que vous pouvez l'utiliser pour indexer vos données.

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

Je ne suis pas un programmeur Java, il doit y avoir une plus belle façon de mettre en œuvre une carte de Bundles, mais cela fonctionne :)

+1

Lorsque vous démarrez une activité, votre activité peut être tuée. Donc, l'indice sera parti. Je pense que vous devrez persister le Bundle quelque part en dehors de la mémoire de votre application. – rumpel

+0

Pour ajouter au commentaire de @rumpel, vous pouvez le tester en allant dans Paramètres> Options du développeur et en activant "Ne pas conserver les activités". De cette façon, vous serez en mesure de tester cette fonctionnalité et de constater que les données de myDataTransfer seront effacées, sauf si vous enregistrez/restaurez manuellement dans onSaveInstanceState – strangetimes

0

ok Vérifiez si votre activité android: launchMode est configuré comme SingleTask ou SingleInstance! ça doit être le problème :)

+0

Cela n'aide pas. – Pentium10

+0

Bonjour Pentium10, avez-vous résolu cela? Je pense que tout va bien dans votre code: S – Jorgesys

+1

Je n'ai pas résolu. Je pense que les extras personnalisés que nous passons à cette autre activité ne sont pas conservés. – Pentium10

0

Je rencontrais aussi des problèmes avec ça.

Au lieu de cette ligne

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

Essayez

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

Le champ EXTRA_ONLINE_ID devra être réglé dans l'activité que vous avez lancé à l'aide setResult. Si ce n'est pas la définition de cette valeur dans l'intention retournée (qui est différente de ce que vous avez envoyé), alors vous obtiendrez une valeur nulle.

+0

Comme vous le voyez, il utilise ContactsContract.Contacts.CONTENT_URI qui ne fait pas partie de ma base de code. – Pentium10

+0

Je ne peux pas aider alors je suppose. Les questions sont, pourquoi voulez-vous retourner les données que vous avez déjà. – Abhinav

+0

Je veux le rendre compatible avec un autre fragment de code. – Pentium10

Questions connexes