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.
- Se mostró un fragmento de color negro.
- Alternar
- Ver buscapersonas, que puede deslizar entre los fragmentos púrpura y azul que se muestran.
- Alternar
- Se mostró un fragmento de color negro.
- Alternar
- 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);