web-dev-qa-db-fra.com

FragmentPagerAdapter getItem n'est pas déclenché

Actuellement, avec un FragmentActivity, je bascule entre 2 types de Fragments en utilisant le code suivant.

private void toggle() {
    Fragment oldFragment = getSupportFragmentManager().findFragmentById(R.id.content);
    Fragment fragment = null;
    if (oldFragment instanceof ColorFragment) {
        fragment = new ViewPagerFragment();
    } else {
        fragment = new ColorFragment(Android.R.color.black);
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commitAllowingStateLoss();
}

2 fragments sont en train de basculer.

  • ColorFragment - Un simple fragment qui remplit son arrière-plan de couleur noire.
  • ViewPagerFragment - Un fragment contient ViewPager. L'utilisateur peut balayer un fragment de couleur pourpre et un fragment de couleur bleu.

Le code qui est responsable du balayage des fragments de couleurs pourpre et bleu est comme ci-dessous.

private static class MyFragmentPagerAdapter extends FragmentPagerAdapter {

    public MyFragmentPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public int getCount() {
        return 2;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
        case 0:
            return new ColorFragment(Android.R.color.holo_purple);
        default:
            return new ColorFragment(Android.R.color.holo_blue_bright);
        }
    }      
} 

Cependant, je rencontre le comportement étrange lors de la bascule.

  1. Un fragment de couleur noire a été montré.
  2. Basculement.
  3. Affichez le pager, qui peut glisser entre les fragments violets et bleus illustrés.
  4. Basculement.
  5. Un fragment de couleur noire a été montré.
  6. Basculement.
  7. Rien n'est affiché car le getItem de MyFragmentPagerAdapter n'est pas déclenché.

Je pense que ma situation est similaire à FragmentPagerAdapter getItem n'est pas appelé

Cependant, je préfère ne pas utiliser FragmentStatePagerAdapter, à cause de le coût de la surcharge potentiellement plus importante lors du passage d'une page à l'autre.

Une solution de rechange pour surmonter ce problème?

J'inclus un code source complet et exploitable pour illustrer ce problème: https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.Zip

35
Cheok Yan Cheng

Une solution de rechange pour surmonter ce problème?

J'ai téléchargé votre code et le problème apparaît car vous ne gérez pas les droits Fragments. Plus précisément, vous utilisez Fragments imbriqué dans ViewPager basé sur Fragment et pour cela ViewPager, vous créez l'adaptateur comme suit:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getFragmentManager());

Au lieu de cela, vous devriez utiliser getChildFragmentManager() pour lier les fragments imbriqués:

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

En outre, vous ne devez pas transmettre de données via un constructeur à un Fragment car ces données ne survivront pas à un changement de configuration et de mauvaises choses commenceront à apparaître. Utilisez plutôt un Bundle.

107
Luksprog

Solution globale testée de travail.

getSupportFragmentManager() conserve parfois la référence null et View pager ne crée pas d'instance de fragment. Depuis qu'il trouve une référence au même fragment. Donc, pour surmonter cette utilisation, getChildFragmentManager() résout le problème de manière simple.

Ne pas  

new PagerAdapter(getSupportFragmentManager(), fragments);

Faire

new PagerAdapter(getChildFragmentManager() , fragments);

12
Vinayak

Dans mon cas, j'appelais correctement

MyFragmentPagerAdapter myFragmentPagerAdapter = new MyFragmentPagerAdapter(this.getChildFragmentManager());

mais dans le fragment imbriqué, j'essayais de remplacer le fragment de conteneur par un autre en utilisant:

getFragmentManager()

Vous devez aller à l'activité et appeler

getActivity().getSupportFragmentManager();
1
kingston

Dans mes cas, cela a fonctionné après l'ajout de ceci à mon FragmentPagerAdapter :

    @Override
    public int getItemPosition(Object object) {
        return POSITION_NONE;
    }

et j'ai aussi utilisé getChildFragmentManager () comme dit Luksprog

0
Jorge Casariego

Utilisation simple FragmentStatePagerAdapter au lieu de FragmentPagerAdapter

ou

vous pouvez utiliser new MyFragmentPagerAdapter(this.getChildFragmentManager())

J'espère que ça vous aidera :)

0
Neo