FragmentPagerAdapter getItem n'est pas déclenché
Actuellement, avec un FragmentActivity
, je bascule entre les 2 type 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 remplissent ses arrière-plan avec des aplats de couleur noire.
- ViewPagerFragment - Un fragment contient
ViewPager
. L'utilisateur peut glisser entre un pourpre couleur de fragment, et d'une couleur bleu fragment.
Le code de la responsable de balayage violet et bleu de la couleur des fragments sont 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 l'étrange comportement pendant le basculement.
- Couleur noire fragment a été montré.
- Basculement.
- Vue de radiomessagerie, qui peut glisser entre le violet et le bleu des fragments montré.
- Basculement.
- Couleur noire fragment a été montré.
- Basculement.
- Rien montré, comme MyFragmentPagerAdapter de getItem 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 de FragmentStatePagerAdapter
, en raison de le coût potentiellement plus généraux lors de la commutation entre les pages.
Aucune solution de contournement pour résoudre ce problème?
- Je inclure une complète réalisable code source pour illustrer ce problème : https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip
- Je préfère ne pas utiliser de FragmentStatePagerAdapter - eh bien, avez-vous au moins essayé de voir si cela fait une différence? en raison du coût de potentiellement plus de surcharge lors de la commutation entre les pages. - ce que potentiellement le dessus? le scénario que vous avez posté avec deux fragments est mort simple.
- Le 2 violet et bleu de la couleur des fragments à des fins de démonstration. Le cas réels fragments sont plus compliquées que cela. Je sais que je peux réduire étendre certaines de surcharge, par la sauvegarde de l'information par le biais de bundle, ou conservés exemple de fragment de technique. cependant, je me rends compte que le meilleur moyen pour éviter la surcharge pour mon cas, est d'éviter d'utiliser FragmentStatePagerAdapter.
Vous devez vous connecter pour publier un commentaire.
J'ai téléchargé votre code et le problème semble parce que vous n'avez pas gérer ces
Fragments
droit. Plus précisément, vous imbriquerFragments
dans leViewPager
en fonctionFragment
et pour queViewPager
vous créez la carte comme ceci:Au lieu de cela, vous devriez être en utilisant
getChildFragmentManager()
de lier la imbriquée fragments:Aussi, vous ne devez pas transmettre des données par le biais d'un constructeur à un
Fragment
que ces données ne survivra pas à un changement de configuration et de mauvaises choses vont commencer à apparaître. Utiliser unBundle
à la place.ViewPagerFragment
exemple sera de retour leFragmentManager
de laActivity
(en gros, c'est la valeur degetSupportFragmentmanager()
dans leFragmentActivity
utilisé pour ajouter de laFragment
). Comme vous imbriquer des fragments de ceux-ci exigent lagetChildFragmentManager()
de sorte qu'ils peuvent être attachés à la mère fragment.getFragmentManager()
etgetChildFragmentManager
ne sont pas la même chose dans unFragment
(on renvoie le fragment lié au fragment et l'autre est le fragmentmanager utilisé pour sa imbriquée fragments).getItem(int pos)
obtenez toujours pas appelé, mais le viewpager montre des fragments parfaitement! Une idée?Global de travail de la solution testée.
getSupportFragmentManager()
conserve la référence nulle, à certains moments, et Vue pager ne pas créer un nouveau fragment de l'instance.Depuis qu'il trouve de référence à même fragment. Afin de surmonter cette utilisationgetChildFragmentManager()
résout le problème de façon simple.Ne pas
new PagerAdapter(getSupportFragmentManager(), fragments);
Ne
new PagerAdapter(getChildFragmentManager() , fragments);
Dans mon cas, j'ai été correctement appelant
mais ensuite, dans le sous-fragment j'ai essayé de remplacer le conteneur fragment à un autre en utilisant:
Vous avez besoin d'aller à l'activité et l'appel
Dans mon cas cela a fonctionné après l'ajouter à mon FragmentPagerAdapter:
et j'ai aussi utilisé getChildFragmentManager() comme Luksprog dit
Simple d'utilisation
FragmentStatePagerAdapter
au lieu deFragmentPagerAdapter
ou
vous pouvez utiliser
new MyFragmentPagerAdapter(this.getChildFragmentManager())
Espère que ça vous aidera 🙂