Mauvaise demandeCode inActivityResult

Je commence une nouvelle activité à partir de mon fragment avec

startActivityForResult(intent, 1); 

et souhaitez gérer le résultat dans l’activité parent du fragment:

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { Log.d(TAG, "onActivityResult, requestCode: " + requestCode + ", resultCode: " + resultCode); if (requestCode == 1) { // bla bla bla } } 

Le problème est que je n’ai jamais eu le requestCode je viens de poster sur startActivityForResult() .

J’ai quelque chose comme 0x40001 , 0x20001 etc. avec un bit aléatoire plus élevé. Les docs ne disent rien à ce sujet. Des idées?

Vous appelez startActivityForResult() partir de votre Fragment . Lorsque vous faites cela, le requestCode est modifié par l’ Activity propriétaire du Fragment .

Si vous voulez obtenir le resultCode de resultCode correct dans votre activité, essayez ceci:

Changement:

 startActivityForResult(intent, 1); 

À:

 getActivity().startActivityForResult(intent, 1); 

Le code de demande n’est pas faux. Lorsque vous utilisez des fragments de bibliothèque de support v4, l’index de fragment est codé dans les 16 premiers bits du code de requête et votre code de demande se trouve dans les 16 bits inférieurs. L’index de fragment est ensuite utilisé pour trouver le fragment correct pour fournir le résultat.

Par conséquent, pour les activités démarrées, un object fragment de formulaire, gérez onActivityResult requestCode comme suit:

 originalRequestCode = changedRequestCode - (indexOfFragment << 16) 6 = 196614 - (3 << 16) 

Plus facile:

int unmaskedRequestCode = requestCode & 0x0000ffff

Vérifiez les 16 bits inférieurs, démasquez-le en faisant un ET logique avec les 16 bits supérieurs mis à zéro

 protected void onActivityResult(int requestCode, int resultCode, Intent data) { final int unmaskedRequestCode = requestCode & 0x0000ffff if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){ //Do stuff } } 

Si vous fournissez constant, rendez-le public, puis utilisez-le dans startActivityResult

Exemple:

 public static final int REQUEST_CODE =1; getActivity().startActivityForresult(intent, REQUEST_CODE); 

Vous pouvez également définir
super.onActivityResult(requestCode, resultCode, data)
dans Activity (si vous substituez onActivityResult ) à cette

 @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { switch (requestCode) { ... default: super.onActivityResult(requestCode, resultCode, data); } } 

et appelez startActivityForResult(intent, requestCode) dans votre Fragment

en fragment

  getActivity().startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST); 

dans l’activité principale:

 if (requestCode == PLACE_PICKER_REQUEST) { if (resultCode == RESULT_OK) { //what ever you want to do }