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 message que requestCode
je viens de publier startActivityForResult()
.
J'ai obtenu quelque chose comme 0x40001
, 0x20001
etc. avec un ensemble de bits supérieur aléatoire. Les documents ne disent rien à ce sujet. Des idées?
android
android-fragments
onactivityresult
Dimanoïde
la source
la source
Réponses:
Vous appelez
startActivityForResult()
depuis votreFragment
. Lorsque vous effectuez cette opération, lerequestCode
est modifié par leActivity
propriétaire duFragment
.Si vous voulez obtenir le bon résultat
resultCode
dans votre activité, essayez ceci:Changement:
À:
la source
startActivityForResult
dans un fragment et attendez le résultat deonActivityResult
ce fragment, assurez-vous simplement d'appelersuper.onActivityResult
l'activité hôte (au cas où vous surchargeriez cette méthode là). C'est parce que l'activitéonActivityResult
semble appeler celle du fragmentonActivityResult
. Notez également que le code de demande, lorsqu'il parcourt l'activitéonActivityResult
, est modifié comme expliqué dans le lien que Dimanoid a publié dans sa réponse ci-dessous. Vous pourriez ne pas avoir besoin de savoir cela mais vous ne savez jamais ...Le code de demande n'est pas faux. Lorsque vous utilisez des fragments de bibliothèque de prise en charge v4, l'index des fragments est codé dans les 16 premiers bits du code de demande et votre code de demande est dans les 16 derniers bits. L'index de fragment est ensuite utilisé pour trouver le fragment correct pour fournir le résultat.
Par conséquent, pour les activités ayant commencé l'objet fragment de formulaire, gérez onActivityResult requestCode comme ci-dessous:
la source
Plus facile:
Java :
int unmaskedRequestCode = requestCode & 0x0000ffff
Kotlin :
val unmaskedRequestCode = requestCode and 0x0000ffff
Vérifiez les 16 bits inférieurs, démasquez-le simplement en faisant un ET logique avec les 16 bits supérieurs mis à zéro
la source
Si vous fournissez constant rendez-le public, puis utilisez-le dans
startActivityResult
exemple:
la source
Vous pouvez également définir
super.onActivityResult(requestCode, resultCode, data)
dans
Activity
(si vous remplacezonActivityResult
) à ceet appeler à l'
startActivityForResult(intent, requestCode)
intérieur de votreFragment
la source
en Fragment
dans l'activité principale:
la source