Je commence une nouvelle activité à partir de mon fragment avec
startActivityForResult(intent, 1);
et voulez 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 reçu la requestCode
que je viens d’afficher dans startActivityForResult()
.
J'ai quelque chose comme 0x40001
, 0x20001
etc. avec un jeu de bits supérieur aléatoire. Les docs ne disent rien à ce sujet. Des idées?
Vous appelez startActivityForResult()
depuis votre Fragment
. Lorsque vous faites cela, la requestCode
est modifiée par la Activity
qui possède la Fragment
.
Si vous voulez obtenir la bonne resultCode
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 requête dans les 16 derniers bits. L'index de fragment est utilisé par la suite pour trouver le bon fragment pour livrer le résultat.
Par conséquent, pour les activités de fragment d'objet de formulaire démarrées, gérez onActivityResult requestCode comme ci-dessous:
originalRequestCode = changedRequestCode - (indexOfFragment << 16)
6 = 196614 - (3 << 16)
Plus facile:
int unmaskedRequestCode = requestCode & 0x0000ffff
Recherchez les 16 bits inférieurs, démasquez-le simplement en effectuant 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 proposez constamment de le rendre public, puis utilisez-le dans startActivityResult
exemple:
public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
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
}