1

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

0

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.