Les loisirs de fragments ViewPager sont repris mais pas visibles

J'ai un problème avec un ViewPager + FragmentPageAdapter.

Scénario: J'ai une activité avec un fragment Fragment A. Le fragment A a un ViewPager avec Fragment B1 e Fragment B2. B1 e B2 sont de la même classe, mais des données différentes comme argument.

  • Pourquoi la vue est-elle glissée avec ViewDragHelper réinitialisé à sa position d'origine sur la mise en page ()?
  • Créer une application de suivi GPS Android
  • Où sont les options de ligne de commande supplémentaires dans Android Studio version 1.5.1 pour l'émulateur
  • Répétez-vous en mode imageable?
  • Service vs IntentService
  • Android comment créer une vignette d'exécution
  • Problème: tout fonctionne bien au moment de la création. Mais lorsque l'application est en arrière-plan et que le processus est tué par Android, en essayant de restaurer le dernier état, de remettre l'application à nouveau, Fragment B1 e B2 ne sont pas visibles au premier plan, alors que le Fragment A est. Ce qui semble un peu étrange, c'est que Fragment B1 e B2 est int Fragment A ChildFragmentManager et sont repris car onStart () et onResume () sont appelés (vu par Log). En outre, le pager est repris avec deux pages, mais vide ou mieux avec rien visible.

    Si je comprends bien comment FragmentPagerAdapter fonctionne, il devrait être de sa responsabilité de gérer ses propres fragments et comment ils doivent être recréés. De plus, pour appliquer ce point, FragmentPagerAdapter n'appelle pas getItem (position int) lorsque vous revenez d'arrière-plan s'il existe déjà un fragment dans cette position avec une étiquette spécifiée.

    … alors pourquoi je ne vois pas Fragment B1 e B2, mais juste le Pager vide?

    C'est mon exemple de code.

    FragmentA

    @Override public void onStart() { super.onStart(); populateViewPager(); } private void populateViewPager() { pager.setAdapter(new MyFragmentPageAdapter(getChildFragmentManager())); indicator.setViewPager(pager); indicator.notifyDataSetChanged(); } 

    FragmentPagerAdapter

     public class MyFragmentPageAdapter extends FragmentPagerAdapter { public MyFragmentPageAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return FragmentB.newInstance(position); } @Override public int getCount() { return 2; } @Override public CharSequence getPageTitle(int position) { String title = ""; if (position == 0) title = "Fragment B1"; else if (position == 1) title = "Fragment B2"; return title; } } 

    Fragment B

      public static FragmentB newInstance(int position) { FragmentB f = new FragmentB(); Bundle b = new Bundle(); b.putInt(POSITION_IN_PAGER_ARGUMENT, position); f.setArguments(b); return f; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d(TAG, "onCreate"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); Log.d(TAG, "onCreateView"); View root = inflater.inflate(R.layout.fragment_b_layout, container, false); empty = (TextView) root.findViewById(R.id.empty); list = (ListView) root.findViewById(R.id.list); return root; } @Override public void onStart() { super.onStart(); Log.d(TAG, "onStart"); populateListView(loadData()); } @Override public void onStop() { super.onStop(); } } 

  • Erreur! Utilisation de CDATA dans la ressource strings.xml Android
  • Erreur de gonflement du fragment de classe
  • Comment afficher les éléments du menu de débordement dans la barre d'action dans Android
  • Devrait utiliser "sp" au lieu de "dp" pour les tailles de texte
  • Obtenir APK de l'application installée
  • Comment obtenir l'orientation du téléphone Android correspondant à l'orientation humaine?
  • 2 Solutions collect form web for “Les loisirs de fragments ViewPager sont repris mais pas visibles”

    Utilisez FragmentStatePagerAdapter au lieu de FragmentPagerAdapter. Cela a fonctionné pour moi. Mais il y aura des problèmes de mémoire (uniquement lorsque l'orientation de l'écran change) si votre ViewPager a beaucoup de vues à afficher.

    Voici mon PagerDadapter avec des onglets peut-être qu'il peut vous aider un peu:

     public static class TabsAdapter extends FragmentPagerAdapter implements ActionBar.TabListener, ViewPager.OnPageChangeListener { private final Context mContext; private final ActionBar mActionBar; private final ViewPager mViewPager; private final ArrayList<TabInfo> mTabs = new ArrayList<TabInfo>(); static final class TabInfo { private final Class<?> clss; private final Bundle args; TabInfo(Class<?> _class, Bundle _args) { clss = _class; args = _args; } } public TabsAdapter(SherlockFragmentActivity activity, ViewPager pager) { super(activity.getSupportFragmentManager()); mContext = activity; mActionBar = activity.getSupportActionBar(); mViewPager = pager; mViewPager.setAdapter(this); mViewPager.setOnPageChangeListener(this); } /** * methode qui construit un onglet * * @param tab * @param clss * @param args */ public void addTab(ActionBar.Tab tab, Class<?> clss, Bundle args) { TabInfo info = new TabInfo(clss, args); tab.setTag(info); tab.setTabListener(this); mTabs.add(info); mActionBar.addTab(tab); notifyDataSetChanged(); } @Override public int getCount() { return mTabs.size(); } @Override public Fragment getItem(int position) { TabInfo info = mTabs.get(position); return Fragment.instantiate(mContext, info.clss.getName(), info.args); } public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } public void onPageSelected(int position) { mActionBar.setSelectedNavigationItem(position); ((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu(); } public void onPageScrollStateChanged(int state) { } public void onTabSelected(Tab tab, FragmentTransaction ft) { // // force l'appel de onOptionMenuPrepared ((SherlockFragmentActivity) mContext).supportInvalidateOptionsMenu(); Object tag = tab.getTag(); for (int i = 0; i < mTabs.size(); i++) { if (mTabs.get(i) == tag) { mViewPager.setCurrentItem(i); } } } public void onTabUnselected(Tab tab, FragmentTransaction ft) { } public void onTabReselected(Tab tab, FragmentTransaction ft) { } } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.