Ceci est un problème célèbre d'obtenir le résultat de l'activité à un fragment imbriqué, l'activité pourrait envoyer le résultat uniquement au fragment qui a été attaché directement à l'activité, mais pas l'imbriqué un. C'est la raison pour laquelle onActiveResult du fragment imbriqué n'a jamais été appelé quoi qu'il arrive. Dans mon cas, j'ai une activité qui contient un fragment qui a un viewPager avec un tas de fragments. Dans l'un de ces fragments du viewPager j'essaie de lancer une intention de caméra, le résultat retourné par cette intention n'est jamais envoyé au dernier fragment, j'ai essayé plusieurs réponses que j'ai trouvées mais aucune n'est robuste, une des solutions était créer un objet EventBus pour diffuser le resultCode de l'activité à tous les fragments mais cela ne fonctionne pas pour ce cas, aucune aide ??Comment faire onActivityResult est appelé sur le fragment imbriqué de viewpager
Répondre
Je pourrais avoir une solution de travail pour vous puisque j'étais dans une situation très semblable.
En court, je ont cessé de dépendre sur l » onActivityResult()
Fragment
et mis en œuvre une logique de travail moi-même.
Le seul onActivityResult()
auquel vous pouvez faire confiance est celui de votre Activity
.
Vous pouvez créer un interface
comme celui-ci
public interface ActivityResultDispatcher {
// Pass anything you want, Bundle, Intent, ecc...
// For the sake of simplicity I'm using Bundle...
public void dispatchResultData(final Bundle data);
}
et ont vos cours Fragment
mettre en œuvre.
La communication entre votre Activity
et votre primaireFragment
devrait être très facile que vous pouvez faire quelque chose comme ça (dans votre Activity
):
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
final Bundle bundle = new Bundle();
// put data inside Bundle
this.primaryFrament.dispatchResultData(bundle);
}
Maintenant, votre principal Fragment
est celui qui détient le ViewPager
avec les autres classes Frament
.
Donc, dans votre primaire Fragment
vous allez faire:
@Override public void dispatchResultData(final Bundle data) {
for (int i = 0; i < MyViewPager.NUM_FRAGMENTS; i++) {
final ActivityResultDispatcher subFragment = (ActivityResultDispatcher) this.retrieveFragment(i);
// some fragments in ViewPager may be dynamically deleted
if (subFragment != null) {
subFragment.dispatchResultData(data);
}
}
}
La fonction retrieveFragment(final int position)
est un morceau très confortable de code que j'avais trouvé sur le web.
Une mise en œuvre pour un ViewPager
fonctionne comme ceci:
public Fragment retrieveFragment(final int position) {
return this.fragmentManager.findFragmentByTag("android:switcher:" + R.id.my_pager_id + ":" + position);
}
Tous vos Fragment
actifs dans le cours ViewPager
recevront le Bundle
et vous pouvez décider quoi faire avec elle.
Vous pouvez passer plus d'informations au répartiteur, comme
public void dispatchResultData(final Bundle data, final int requestCode);
et votre Fragment
décider si elle doit répondre à l'appel de fonction.
Vous avez fondamentalement construit un utilitaire onActivityResult()
complètement fonctionnel et pouvez être sûr que tous vos Fragments
(si instancié) recevront le résultat.