J'ai un fragment qui contient un ViewPager. Le ViewPager est associé à un adaptateur qui contient un ensemble de fragments.
Au moment de charger le fragment parent, je suis confronté à une IllegalStateException
avec le message : java.lang.IllegalStateException: Recursive entry to executePendingTransactions
.
Quelques recherches m'ont amené à la conclusion que le système est incapable d'afficher des fragments à l'intérieur d'un autre fragment. CEPENDANT, il semble qu'il soit possible de faire exactement cela en utilisant un ViewPager ( Un bug dans le ViewPager en l'utilisant avec un autre fragment ).
En fait, si j'ajoute un bouton à mon fragment parent qui appelle mPager.setAdapter(mAdapter)
sur mon ViewPager lorsqu'on appuie dessus, le ViewPager se charge avec succès. Ce n'est pas idéal.
Le problème doit donc être lié au cycle de vie des fragments. Ma question est donc la suivante : Quelqu'un d'autre a-t-il trouvé un moyen de contourner ce problème, et si oui, comment ?
Existe-t-il un moyen de retarder le paramétrage de l'adaptateur sur le ViewPager jusqu'après la transaction du fragment ?
Voici le code de mon fragment de parent :
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.team_card_master, container, false);
mViewPager = (ViewPager)mView.findViewById(R.id.team_card_master_view_pager);
final Button button = (Button)mView.findViewById(R.id.load_viewpager_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mViewPager.setAdapter(mAdapter);
button.setVisibility(View.GONE);
}
});
mAdapter = new ViewPagerAdapter(getFragmentManager());
// mViewPager.setAdapter(mAdapter);
return mView;
}
Et l'adaptateur :
public class ViewPagerAdapter extends FragmentPagerAdapter {
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public int getCount() {
if (mCursor == null) return 0;
else return mCursor.getCount();
}
@Override
public Fragment getItem(int position) {
Bundle b = createBundle(position, mCursor);
return TeamCardFragment.newInstance(b);
}
}
8 votes
La possibilité d'imbriquer des fragments a été ajoutée dans la révision 11 de la bibliothèque Android Support. La classe Fragment possède maintenant la méthode "getChildFragmentManager" . J'ai créé un projet simple similaire à celui-ci qui peut être trouvé à l'adresse suivante github.com/marsucsb/nested-fragments
0 votes
stackoverflow.com/q/18097567/1503130 Pouvez-vous m'aider ?