En mi aplicación el fragmento actividad tiene dos fragmentos, Fragmento de Un Fragmento y B. Fragmento B es un punto de vista de buscapersonas que contiene 3 fragmentos.

ViewPager en el interior del fragmento, cómo conservar el estado?

En mi actividad, para evitar que el fragmento es recreado en config cambios:

if(getSupportFragmentManager().findFragmentByTag(MAIN_TAB_FRAGMENT) == null) {
    getSupportFragmentManager().beginTransaction().replace(R.id.container, new MainTabFragment(), MAIN_TAB_FRAGMENT).commit();
}

Código para el Fragmento B:

public class MainTabFragment extends Fragment {

    private PagerSlidingTabStrip mSlidingTabLayout;
    private LfPagerAdapter adapter;
    private ViewPager mViewPager;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setRetainInstance(true);
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_tab, container, false);
    }

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState) {

        this.adapter = new LfPagerAdapter(getChildFragmentManager());

        this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
        this.mViewPager.setAdapter(adapter);

        this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
        this.mSlidingTabLayout.setViewPager(this.mViewPager);
    }
}

Código para el adaptador:

public class LfPagerAdapter extends FragmentPagerAdapter {

    private static final int NUM_ITEMS = 3;

    private FragmentManager fragmentManager;

    public LfPagerAdapter(FragmentManager fm) {
        super(fm);
        this.fragmentManager = fm;
    }

    @Override
    public int getCount() {
        return NUM_ITEMS;
    }

    @Override
    public Fragment getItem(int position) {
        Log.d("TEST","TEST");
        switch (position) {
            case 1:
                return FragmentC.newInstance();
            case 2:
                return FragmentD.newInstance();
            default:
                return FragmentE.newInstance();
        }
    }
}

Mi problema es que no soy capaz de conservar el estado de la vista de buscapersonas y su hijo fragmentos en los cambios de orientación.

Obviamente, esto se llama en cada rotación:

this.adapter = new LfPagerAdapter(getChildFragmentManager());

que hará que todo el localizador para ser divertido, ¿verdad? Como resultado

getItem(int position)

será llamado en cada rotación y el fragmento se creó a partir de cero y perder su estado:

return FragmentC.newInstance();

He intentado solucionar con esto:

if(this.adapter == null)
    this.adapter = new LfPagerAdapter(getChildFragmentManager());

en onViewCreated pero el resultado fue que en la rotación de los fragmentos en el interior del localizador donde eliminado.

Alguna idea de cómo conservar correctamente el estado dentro de la buscapersonas?

Hice esto por guardar el fragmento estado (y el localizador de posición) en el instanceState (no sé exactamente anular ya que no tengo acceso a Eclipse ahora). A continuación, en el OnCreate (si en la actividad) o OnCreateView() (si en el fragmento), puedo comprobar si existen y, a continuación, volver a crearlos.
Fragments son gestionadas automáticamente y restaurado por el FragmentManager, y el PagerAdapter implementaciones están diseñados para mantener una referencia persistente a ellos. El getItem() sólo se llama una vez para la inicialización de cada página.
Parece que Fragments se conservan ya. ¿qué es exactamente lo que usted quiere realizar? puede usted describir poco más?

OriginalEl autor Artjom Zabelin | 2014-11-18

2 Comentarios

  1. 26

    Usted tendrá que hacer 2 cosas a resolver el problema:

    1) Usted debe usar onCreate método en lugar de onViewCreated para crear instancias de LfPagerAdapter;

    decir:

        public class MainTabFragment extends Fragment {
    
        private PagerSlidingTabStrip mSlidingTabLayout;
        private LfPagerAdapter adapter;
        private ViewPager mViewPager;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setRetainInstance(true);
            this.adapter = new LfPagerAdapter(getChildFragmentManager());
        }
    
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            return inflater.inflate(R.layout.fragment_tab, container, false);
        }
    
        @Override
        public void onViewCreated(View view, Bundle savedInstanceState) {
    
    
            this.mViewPager = (ViewPager) view.findViewById(R.id.viewpager);
            this.mViewPager.setAdapter(adapter);
    
            this.mSlidingTabLayout = (PagerSlidingTabStrip) view.findViewById(R.id.sliding_tabs);
            this.mSlidingTabLayout.setViewPager(this.mViewPager);
        }
    }

    2) deberá extender FragmentStatePagerAdapter en lugar de FragmentPagerAdapter

    FragmentPagerAdapter nunca se separa la Fragments por lo que son gestionadas automáticamente y retenidos por el FragmentManager como de costumbre, y ambos de los adaptadores de mantener una referencia persistente a ellos. La retención de la Fragment instancia no es necesario, y de hecho incluso podría interferir en algunos aspectos con la semántica de la retención de los miembros de la Views y/o niño Fragments.
    entonces, ¿qué es necesario hacer para resolver el problema?
    Nada – no hay ningún problema para empezar. Si el Fragment instancia no se conserva, entonces el estado de la ViewPager y el niño Fragments ya debe ser administrado (aunque usted puede ser que necesite para configurarlo adecuadamente para retener la página actual).
    no se conservan o se conservan? No me llega a su punto.
    Como dije en mi primer comentario: «la Retención de la Fragment instancia no es necesario, y de hecho incluso podría interferir en algunos aspectos con la semántica de la retención de los miembros de la Views y/o niño Fragments.». Estoy hablando de la setRetainInstance(true); llamada en la Fragment código de inicialización.

    OriginalEl autor Mehul Joisar

  2. 1

    Android automáticamente recrear su actividad en la configuración sin esta línea android:configChanges="keyboardHidden|orientation|screenSize" en manifestar de modo que usted puede manejar onConfiguration cambiarse a sí mismo.

    La única manera es utilizar onSaveInstanceState() en tanto su activityFragement para guardar viewPager estado(posición actual, por ejemplo) y en los fragmentos donde usted necesita para guardar cosas

    Ejemplo sobre cómo usted puede guardar la posición actual de viewpager y restaurar onConfiguration cambio

        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
                int position = mViewPager.getCurrentItem();
                outState.Int("Key", position );
        }
    
        @Override //then restore in on onCreate();
        public void onCreated(Bundle savedInstanceState) {
            super.onCreated(savedInstanceState);
            //do stuff
            if (savedInstanceState != null) {
                  int  position= savedInstanceState.getInt("Key");
                mViewPager.setCurrentItem(position)
            }
        }

    Por supuesto, este es un ejemplo muy básico.

    Ps: para restaurar en el fragmento de uso onActivityCreated() en lugar de onCreate() método.

    Aquí es otro ejemplo de cómo conservar el estado : Haga clic en me!

    En realidad, ViewPager gestiona el almacenamiento y restauración de la posición actual, si el adaptador se establece en el momento adecuado después de la View los estados se han restaurado.
    Yo sé que esto fue hace un tiempo, pero @corsair992 podría ampliar esto? Suena como exactamente lo que necesito.
    Echando un vistazo al código fuente de ViewPager en la última versión de la biblioteca de compatibilidad, parece que ahora debe manejar adecuadamente la persistencia de la posición y el adaptador de estado en todos los casos. Están teniendo algún problema con esto?
    Gracias por la respuesta! Terminé haciendo una pregunta y se responde aquí: stackoverflow.com/questions/29464522/…

    OriginalEl autor murielK

Dejar respuesta

Please enter your comment!
Please enter your name here