Mauvais requestCode dans onActivityResult

je commence une nouvelle activité à partir de mon Fragment avec

startActivityForResult(intent, 1);

et veulent gérer le résultat de 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 jeu de bits supérieur aléatoire. Les docs ne disent rien à ce sujet. Des idées?

231
demandé sur David Rawson 2012-05-12 18:11:30

6 réponses

vous appelez startActivityForResult() de votre Fragment . Lorsque vous faites cela, le requestCode est remplacé par le Activity qui possède la Fragment .

si vous voulez obtenir le correct resultCode dans votre activité essayez ceci:

changement:

startActivityForResult(intent, 1);

à:

getActivity().startActivityForResult(intent, 1);
641
répondu Changwei Yao 2015-04-15 21:00:09

le code de requête n'est pas erroné. Lors de l'utilisation de fragments de bibliothèque v4 support, fragment index est encodé dans les 16 bits supérieurs du code de requête et votre code de requête est dans les 16 bits inférieurs. L'indice de fragment est ensuite utilisé pour trouver le fragment correct pour fournir le résultat.

donc pour les activités commencées d'objet fragment, handle onActivityResult requestCode comme ci-dessous:

originalRequestCode = changedRequestCode - (indexOfFragment << 16)
      6             =      196614        -       (3 << 16)
21
répondu Ashlesha Sharma 2018-06-01 02:04:50

plus facile:

int unmaskedRequestCode = requestCode & 0x0000ffff

vérifier pour les 16 bits inférieurs, il suffit de le démasquer en faisant un logique et avec les 16 bits supérieurs à zéro

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

    final int unmaskedRequestCode = requestCode & 0x0000ffff

    if(unmaskedRequestCode == ORIGINAL_REQUEST_CODE){
      //Do stuff

    }
}
13
répondu Jaime Agudo 2017-03-09 17:57:03

Si vous êtes à la fourniture constante de les rendre publics et de l'utiliser ensuite dans startActivityResult

exemple:

public static final int REQUEST_CODE =1;
getActivity().startActivityForresult(intent, REQUEST_CODE);
6
répondu Nilesh Tiwari 2016-02-26 21:45:37

, Vous pouvez aussi définir

super.onActivityResult(requestCode, resultCode, data)

dans Activity (si vous outrepassez onActivityResult ) à ce

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    switch (requestCode) {

        ...

        default:
            super.onActivityResult(requestCode, resultCode, data);
    }
}

et appelez startActivityForResult(intent, requestCode) à l'intérieur de votre Fragment

2
répondu TarikW 2016-08-06 13:52:08

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
répondu Null Pointer Exception 2018-02-15 13:34:52