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 }