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.
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.
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
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
.
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);
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();
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
Utilisation simple FragmentStatePagerAdapter
au lieu de FragmentPagerAdapter
ou
vous pouvez utiliser new MyFragmentPagerAdapter(this.getChildFragmentManager())
J'espère que ça vous aidera :)