L'activité hébergeant ce fragment a son onActivityResult
nom lorsque l'activité de la caméra revient.
Mon fragment démarre une activité pour un résultat avec l'intention envoyée à l'appareil photo de prendre une photo. L'application d'image se charge correctement, prend une photo et revient. Le onActivityResult
cependant n'est jamais touché. J'ai défini des points d'arrêt, mais rien n'est déclenché. Un fragment peut-il avoir onActivityResult
? Je pense que oui car c'est une fonction fournie. Pourquoi cela n'est-il pas déclenché?
ImageView myImage = (ImageView)inflatedView.findViewById(R.id.image);
myImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View view) {
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, 1888);
}
});
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if( requestCode == 1888 ) {
Bitmap photo = (Bitmap) data.getExtras().get("data");
((ImageView)inflatedView.findViewById(R.id.image)).setImageBitmap(photo);
}
}
requestCode >= 0
!Réponses:
L'activité d'hébergement est prioritaire
onActivityResult()
, mais n'a pas appelé poursuper.onActivityResult()
des codes de résultat non gérés. Apparemment, même si le fragment est celui qui fait l'startActivityForResult()
appel, l'activité obtient le premier coup pour gérer le résultat. Cela a du sens lorsque vous considérez la modularité des fragments. Une fois que j'ai implémentésuper.onActivityResult()
tous les résultats non gérés, le fragment a réussi à gérer le résultat.Et aussi de la réponse @siqing:
Pour obtenir le résultat dans votre fragment, assurez-vous d'appeler
startActivityForResult(intent,111);
au lieu de l'getActivity().startActivityForResult(intent,111);
intérieur de votre fragment.la source
getParentFragment().startActivityForResult
pour que le fragment parent ait sa méthode onActivityResult appelée.Je pense que vous avez appelé
getActivity().startActivityForResult(intent,111);
. Tu devrais appelerstartActivityForResult(intent,111);
.la source
RingtonePreference
localisation dePreferenceFragment
. Malheureusement, lesRingtonePreference
appelsgetActivity().startActivityForResult()
et je n'ai pas obtenu de résultats même si j'appellesuper.onActivityResult
les activitésonActivityResult
. J'ai été obligé de créer un dérivé de laRingtonePreference
classe, qui se lie auxPreferenceFragment
appels etfragment.startActivityForResult()
.Option 1:
Si vous appelez à
startActivityForResult()
partir du fragment, vous devez appelerstartActivityForResult()
nongetActivity().startActivityForResult()
, car cela entraînera un fragment onActivityResult ().Si vous ne savez pas où vous appelez
startActivityForResult()
et comment vous appellerez les méthodes.Option 2:
Étant donné que l'activité obtient le résultat de
onActivityResult()
, vous devrez remplacer l'activitéonActivityResult()
et appelersuper.onActivityResult()
pour se propager au fragment respectif pour les codes de résultats non gérés ou pour tous.Si les deux options ci-dessus ne fonctionnent pas, reportez-vous à l'option 3 car cela fonctionnera certainement.
Option 3:
Un appel explicite de fragment à la fonction onActivityResult est le suivant.
Dans la classe Activity parent, substituez la méthode onActivityResult () et même remplacez-la dans la classe Fragment et appelez comme le code suivant.
Dans la classe parent:
En classe enfant:
la source
setResult(); finish();
lorsque j'appuie sur la deuxième activité, puis je suis égalementonActivityResult
appelé avec fourniRESULT_CODE
.onActivityResult()
activité retourne un étrangerequestCode
qui est passé à mon fragment puis ignoré = /Dans le cas où vous ne connaissez pas de fragments dans votre activité, énumérez-les tous et envoyez des arguments de résultat d'activité:
la source
J'ai ce même problème avec le
ChildFragmentManager
. Le gestionnaire ne transmettra pas le résultat au fragment imbriqué, vous devez le faire manuellement dans votre fragment de base.la source
Fragment fragment = myChildFragment;
pour remplacer lafindFragmentByTag
ligne de code ci-dessus . Le reste peut rester inchangé.Poste d'origine.
FragmentActivity
remplacerequestCode
par un modèle modifié. Après cela, lorsqueonActivityResult()
sera invoqué,FragmentActivity
analyse les 16 bits supérieurs et restaure l'index du fragment d'origine. Regardez ce schéma:Si vous avez quelques fragments au niveau racine, il n'y a aucun problème. Mais si vous avez des fragments imbriqués , par exemple
Fragment
avec quelques onglets à l'intérieurViewPager
, vous aurez sûrement face à un problème (ou déjà rencontré).Parce qu'un seul index est stocké à l'intérieur
requestCode
. C'est l'indice de l'Fragment
intérieur de sonFragmentManager
. Lorsque nous utilisons des fragments imbriqués, il y a des enfantsFragmentManager
, qui ont leur propre liste de fragments. Il est donc nécessaire de sauvegarder toute la chaîne des indices, à partir de la racineFragmentManager
.Comment pouvons-nous résoudre ce problème? Il existe une solution de contournement courante dans ce message .
GitHub: https://github.com/shamanland/nested-fragment-issue
la source
C'est l'un des problèmes les plus populaires. Nous pouvons trouver beaucoup de discussions sur ce problème. Mais aucun d'eux n'est utile pour MOI.
J'ai donc résolu ce problème en utilisant cette solution.
Voyons d'abord pourquoi cela se produit.
Nous pouvons appeler
startActivityForResult
directement à partir de Fragment mais en fait, les mécaniciens derrière sont tous gérés par Activity.Une fois que vous appelez
startActivityForResult
partir d'un fragment, requestCode sera modifié pour attacher l'identité du fragment au code. Cela permettra à Activity de retracer celui qui envoie cette demande une fois le résultat reçu.Une fois que l'activité a été parcourue, le résultat sera envoyé à onActivityResult de l'activité avec le requestCode modifié qui sera décodé en l'identité de requestCode + Fragment d'origine. Après cela, Activity enverra le résultat de l'activité à ce fragment via onActivityResult. Et tout est terminé.
Le problème est:
L'activité pourrait envoyer le résultat uniquement au fragment qui a été attaché directement à l'activité mais pas à l'imbrication. C'est la raison pour laquelle onActivityResult du fragment imbriqué ne sera jamais appelé quoi qu'il arrive.
Solution:
1) Commencez l'intention dans votre fragment par le code ci-dessous:
2) Maintenant dans votre remplacement d'activité parentale **
onActivityResult()
: **Vous devez l'appeler dans l'activité parent pour que cela fonctionne.
3) Dans votre appel de fragment:
C'est ça. Avec cette solution, elle pourrait être appliquée à tout fragment unique, qu'il soit imbriqué ou non. Et oui, il couvre également tout le cas! De plus, les codes sont également agréables et propres.
la source
POUR DE NOMBREUX FRAGMENTS IMPLIQUÉS (par exemple, lors de l'utilisation d'un ViewPager dans un fragment)
Dans votre activité principale :
Dans votre fragment:
Dans votre fragment imbriqué
Activité d'appel
uniqueInstanceInt - remplacez-le par un unique parmi les fragments imbriqués pour éviter qu'un autre fragment ne traite la réponse.
Recevoir une réponse
Attention
Un nombre compris entre 0 et 65536 doit être utilisé dans uniqueInstanceInt pour éviter les erreurs "Ne peut utiliser que les 16 bits inférieurs pour requestCode".
la source
Je peux ajouter deux conseils si quelqu'un ne peut toujours pas le faire. Dans le fichier Manifest.xml, assurez-vous que l'activité d'hébergement ne s'est pas terminée lors du rappel et que l'activité à démarrer a le mode de lancement en standard. Voir les détails ci-dessous:
Pour l'activité d'hébergement, définissez la propriété no history sur false si vous avez
Pour que l'activité démarre, définissez le mode de lancement comme standard si
la source
J'étais également confronté au même problème une fois que j'ai déplacé ce bloc de code en dehors d'un fragment vers une classe utilitaire , avec un argument
parentActivity
passé ,Ensuite, je n'obtenais aucune valeur dans la
onActivityResult
méthode de ce fragment . Ensuite, j'ai changé l' argument en Fragment , de sorte que la définition révisée de la méthode ressemblait,Après cela, j'ai pu valoriser
onActivityResult
le Fragmentla source
J'ai également rencontré ce problème dans un fragment. Et j'ai appelé
startActivityForResult
dans unDialogFragment
.Mais maintenant , ce problème a été résolu:
FragmentClassname.this.startActivityForResult
.la source
startActivityForResult(...)
depuis une classe abstraite à l'intérieur du code du fragment.POUR LES FRAGMENTS IMPRIMÉS (par exemple, lors de l'utilisation d'un ViewPager)
Dans votre activité principale:
Dans votre fragment principal de premier niveau (fragment ViewPager):
Dans YourFragment (fragment imbriqué):
la source
Dans mon cas, c'était un bug Android ( http://technet.weblineindia.com/mobile/onactivityresult-not-getting-called-in-nested-fragments-android/ ), si vous utilisez un support,
FragmentActivity
vous devez utiliser à lagetSupportFragmentManager
place degetChildFragmentManager
:la source
En bref,
En fragment, déclarez
Fragment fragment = this
;après cette utilisation
fragment.startActivityForResult
.Le résultat retournera dans activityResult.
la source
Solution 1:
Appeler
startActivityForResult(intent, REQUEST_CODE);
au lieu degetActivity().startActivityForResult(intent, REQUEST_CODE);
.Solution 2:
Quand
startActivityForResult(intent, REQUEST_CODE);
est appelé l'activitéonActivityResult(requestCode,resultcode,intent)
est invoquée, puis vous pouvez appelerfragments onActivityResult()
d'ici en passant lerequestCode, resultCode and intent
.la source
À l'intérieur de votre fragment, appelez
où
this
fait référence au fragment. Sinon, faites comme @Clevester a dit:J'ai aussi dû appeler
dans l'activité parentale
onActivityResult
pour le faire fonctionner.(J'ai adapté cette réponse de la réponse de @ Clevester.)
la source
Pour ceux qui utilisent le composant de navigation Android, utilisez dans Activity's
onActivityResult(...)
leprimaryNavigationFragment
pour obtenir sa référence de fragment et appeler fragmentfragment.onActivityResult(...)
.Voici les activités
onActivityResult(...)
la source
La plupart de ces réponses continuent de dire que vous devez appeler
super.onActivityResult(...)
votre hôteActivity
pourFragment
. Mais cela ne semblait pas fonctionner pour moi.Donc, chez votre hôte,
Activity
vous devriezFragments
onActivityResult(...)
plutôt appeler votre . Voici un exemple.À un moment donné de votre,
HostActivity
vous devrez attribuerthis.myFragment
celui queFragment
vous utilisez. Ou, utilisez leFragmentManager
pour obtenir leFragment
au lieu de conserver une référence à celui-ci dans votreHostActivity
. Vérifiez égalementnull
avant d'appeler lethis.myFragment.onActivityResult(...);
.la source
la source
Vous pouvez simplement remplacer BaseActivity
onActivityResult
sur un fragmentbaseActivity.startActivityForResult
.Sur BaseActivity, ajoutez l'interface et remplacez onActivityResult.
Sur les instruments fragmentés
OnBaseActivityResult
Cette solution de contournement fera l'affaire.
la source
Si le problème ci-dessus est rencontré lors de la connexion à Facebook, vous pouvez utiliser le code ci-dessous dans une activité parent de votre fragment comme:
Ou:
Et ajoutez l'appel ci-dessous dans votre fragment ...
la source
Un autre cas d'utilisation non déjà décrit dans d'autres réponses:
onActivityResult()
déclaré dans fragment n'est pas invoqué lors de l'utilisationexception.startResolutionForResult()
:Dans ce cas, remplacez
exception.startResolutionForResult()
par fragmentstartIntentSenderForResult()
:la source
Version Kotlin (Dans votre activité surActivityResult ())
la source
Comme Ollie C l'a mentionné, il existe un bogue actif pour la bibliothèque de support qui utilise les valeurs renvoyées à onActivityResult lorsque vous utilisez des fragments imbriqués. Je viens de le frapper :-(.
Voir Fragment.onActivityResult non appelé lorsque requestCode! = 0 .
la source
J'ai une forte suspicion que toutes les réponses ici ne sont rien d'autre que des hacks. Je les ai tous essayés et bien d'autres, mais sans aucune conclusion fiable car il y a toujours une sorte de problème stupide. Pour ma part, je ne peux pas compter sur des résultats incohérents. Si vous consultez la documentation officielle de l'API Android pour les fragments, vous verrez que Google indique clairement ce qui suit:
Voir: API Android Fragment
Ainsi, il semblerait que l'approche la plus correcte et la plus fiable serait d'appeler réellement startActivityForResult () à partir de l'activité d'hébergement et de gérer également le onActivityResult () résultant à partir de là.
la source
mActivity.startActivityFromFragment(this, intent, requestCode)
- donc ce n'est rien d'autre qu'un emballage pratiqueVotre code a un fragment imbriqué. L'appel de super.onActivityForResult ne fonctionne pas
Vous ne voulez pas modifier chaque activité à partir de laquelle votre fragment peut être appelé et ou contourner l'appel de chaque fragment de la chaîne de fragments.
Voici l'une des nombreuses solutions de travail. créez un fragment à la volée et connectez-le directement à l'activité avec le gestionnaire de fragments de support. Appelez ensuite startActivityForResult à partir du fragment nouvellement créé.
la source
Mon problème était lié à l'activité de l'hôte. Je l'ai trouvé avec un ensemble.
android:launchMode="standard"
Je l'ai supprimé temporairement et cela a fonctionné!la source
onActivityResult ne fonctionnera pas si votre mode de lancement est défini sur SingleInstance ou SingleTask. ou vous appelez votre activité en utilisant ces IntentFilters
standard
ou lesingleTop
mode de lancement fonctionnera bien.la source
Si vous utilisez des fragments imbriqués, cela fonctionne également:
En plus de cela, vous devez appeler
super.onActivityResult
depuis l'activité parent et remplir laonActivityResult
méthode du fragment.la source
J'ai géré le problème en écrivant une classe de base qui s'étend
Fragment
, et dansonactivityresult
l'activité, j'ai identifié le fragment en cours d'exécution à l'aide defragmenttag
. Ensuite, j'appelle une méthode définie par l'utilisateur dans la classe fragmentbase. Cela déclenchera un événement dans le fragment en cours d'exécution.la source