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?
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);
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)
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
}
}
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);
, 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
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
}