with viewpager studio sectionspageradapter fragments example and android android-fragments android-viewpager fragmentpageradapter
https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip

android - viewpager - sectionspageradapter



FragmentPagerAdapter getItem no se está activando (5)

¿Alguna solución para superar este problema?

He descargado tu código y aparece el problema porque no manejas esos Fragments correctamente. Más precisamente, utilizas Fragments anidados en el Fragment basado en ViewPager y para ese ViewPager creas el adaptador como este:

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

En su lugar, debe usar getChildFragmentManager() para enlazar los fragmentos anidados:

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

Además, no debe pasar datos a través de un constructor a un Fragment ya que esos datos no sobrevivirán a un cambio de configuración y las cosas malas comenzarán a aparecer. Use un Bundle lugar.

Actualmente, con FragmentActivity , alternar entre 2 tipos de Fragmentos usando el siguiente código.

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 Fragmentos están siendo alternar.

  • ColorFragment : un fragmento simple que llena su fondo de un color negro sólido.
  • ViewPagerFragment : un fragmento contiene ViewPager . El usuario puede deslizar entre un fragmento de color púrpura y un fragmento de color azul.

El código que se encarga de deslizar los fragmentos de color púrpura y azul son los siguientes.

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); } } }

Sin embargo, encuentro el comportamiento extraño durante alternar.

  1. Se mostró un fragmento de color negro.
  2. Alternar
  3. Ver buscapersonas, que puede deslizar entre los fragmentos púrpura y azul que se muestran.
  4. Alternar
  5. Se mostró un fragmento de color negro.
  6. Alternar
  7. No se muestra nada, ya que el getItem de MyFragmentPagerAdapter no se activa.

Creo que mi situación es similar a FragmentPagerAdapter getItem no se llama

Sin embargo, prefiero no utilizar FragmentStatePagerAdapter , debido al costo de una sobrecarga potencialmente mayor al cambiar de una página a otra.

¿Alguna solución para superar este problema?

Incluyo un código fuente completo y funcional para demostrar este problema: https://www.dropbox.com/s/jok9tz5ktvfcteo/viewpagerbug.zip


En mi caso, estaba llamando correctamente

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

pero luego, en el fragmento anidado, intenté reemplazar el fragmento del contenedor por otro utilizando:

getFragmentManager()

Debes ir a la actividad y llamar

getActivity().getSupportFragmentManager();


En mis casos funcionó después de agregar esto a mi FragmentPagerAdapter :

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

y también utilicé getChildFragmentManager () como dijo Luksprog


Uso simple FragmentStatePagerAdapter lugar de FragmentPagerAdapter

o

puede usar el new MyFragmentPagerAdapter(this.getChildFragmentManager())

Espero que te ayude :)


Solución probada de trabajo global.

getSupportFragmentManager() mantiene la referencia nula algunas veces y View pager no crea una nueva instancia de fragmento. Ya que encuentra referencia al mismo fragmento. Así que para superar este uso getChildFragmentManager() resuelve el problema de una manera simple.

No lo hagas

new PagerAdapter(getSupportFragmentManager(), fragments);

Hacer

new PagerAdapter(getChildFragmentManager() , fragments);