web-dev-qa-db-fra.com

Requête erronée dans onActivityResult

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?

253
Dimanoid

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);
701
Changwei Yao

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)
25
Ashlesha Sharma

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

    }
}
14
Jaime Agudo

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);
6
Nilesh Tiwari

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
            }
0