Los fragmentos de ViewPager desaparecen al cambiar la rotación de la pantalla

Estoy trabajando en la aplicación Android que contiene ViewPager con Fragment s, como este:

MainActivity ( MainActivityFragment ( screenSlideViewPager ( Fragment s))), lo que significa:

Activity contiene Fragment contiene ViewPager contiene Fragment s

Ahora mi problema es cuando rotar el dispositivo o cambiar la rotación de la pantalla todos los fragmentos en ViewPager desaparecen.

Cualquier idea para resolver este problema?

EDITAR 1

MainActivity.java:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentByTag(TAG) == null) { final FragmentTransaction ft = getSupportFragmentManager() .beginTransaction(); ft.add(android.R.id.content, new MainActivityFragment(), TAG); ft.commit(); } } 

MainActivityFragment.java:

 public class MainActivityFragment extends Fragment { private ViewPager mPager = null; private PagerAdapter mPageAdapter = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View reVal = inflater.inflate(R.layout.activity_main, container, false); mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent); mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager()); mPager.setAdapter(mPageAdapter); return reVal; } private MainGridViewFragment mainGridFragment; private AlphabetGridViewFragment alphabetGridFragment; private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public android.app.Fragment getItem(int position) { switch (position) { case 1: mainGridFragment = new MainGridViewFragment(); return mainGridFragment; case 0: alphabetGridFragment = new AlphabetGridViewFragment(); return alphabetGridFragment; default: return null; } } @Override public int getCount() { return 2; } } } 

EDIT 2 La actividad después de la rotación de la pantalla

Obviamente MainActivity y MainActivityFragment se cargan, y la prueba es The ActionBar , observa también que ViewPager está cargado también, porque todavía se puede navegar entre las páginas (la luz azul significa que el paginador llegó a la última página) pero no puedes ver su contenido .

Parece que su actividad principal es usar el getSupportFragmentManager () mientras que su fragmento está usando getFragmentManager ().

No estoy seguro de si esto es digno de un puesto de respuesta, pero mi calificación es demasiado bajo para responder de otra manera. 🙂

Edit: Creo que también puede ser necesario extender una FragmentActivity con la biblioteca de soporte.

Consulte: https://stackoverflow.com/a/10609839/2640693

Editar 2:

 public class MainActivityFragment extends FragmentActivity { private ViewPager mPager = null; private PagerAdapter mPageAdapter = null; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { final View reVal = inflater.inflate(R.layout.activity_main, container, false); mPager = (ViewPager) reVal.findViewById(R.id.pagerMainContent); mPageAdapter = new ScreenSlidePagerAdapter(getChildFragmentManager()); mPager.setAdapter(mPageAdapter); return reVal; } private MainGridViewFragment mainGridFragment; private AlphabetGridViewFragment alphabetGridFragment; private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter { public ScreenSlidePagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { switch (position) { case 1: mainGridFragment = new MainGridViewFragment(); return (Fragment)mainGridFragment; case 0: alphabetGridFragment = new AlphabetGridViewFragment(); return (Fragment)alphabetGridFragment; default: return null; } } @Override public int getCount() { return 2; } } } 

Para los que están teniendo problemas con esto usted puede intentar esto:

 private void InitializeUI(){ mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager()); mViewPager = (ViewPager) findViewById(R.id.container); mViewPager.setAdapter(mSectionsPagerAdapter); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); setContentView(R.layout.activity_exame2); InitializeUI(); } 

Me pasé 2 días en torno a este problema esto fue lo único que funcionó para mí, recuerde que para añadir android: configChanges = "screenSize | orientación" a su actividad en el manifiesto

He intentado muchas soluciones, pero obtener el éxito en cualquiera. Al fin fijé lo siguiente:

  • Use getActivity (). GetSupportFragmentManager () en lugar de getChildFragmentManager ()

  • Anule el método getItemId (int position) en su clase ViewPagerAdapter como a continuación:

     @Override public long getItemId(int position) { return System.currentTimeMillis(); } 

Para mí funciona como el encanto, por favor comenta aquí tu opinión.

Evite crear el viewpager de nuevo. Pon el código de onCreateView en onCreate (). Y haga que su fragmento use onRetainInstance (true). Por lo tanto esto no recreará el fragmento y otra vez porque la opinión está en el onCreate (), no será llamada otra vez.

Compruebe en el onCreateView () si la vista existe, si es así entonces quítelo. Snippets:

 //creates the view private View createView(Bundle savedInstanceState) { View view = getActivity().getLayoutInflater().inflate(your_layout, null, false); //viewpager return view; } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //retains fragment instance across Activity re-creation setRetainInstance(true); viewRoot = createView(savedInstanceState); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (viewRoot != null && viewRoot.getParent() != null) { ViewGroup parent = (ViewGroup) viewRoot.getParent(); parent.removeView(viewRoot); Log.i("Test", "**************view.getParent(): " + viewRoot.getParent() + " " + viewRoot); } return viewRoot; } 

Debes usar un getChildFragmentManager() lugar de getFragmentManager() . Usaste

 mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getFragmentManager()); 

debería haber sido

 mPageAdapter = new ScreenSlidePagerAdapter(getActivity().getChildFragmentManager()); 

En tu fragmento

Tuve este mismo problema. Es tremendamente confuso, pero este hilo me ayudó, excepto que las respuestas realmente no explican por qué funciona.

La solución a este problema es utilizar Fragment.getChildFragmentManager() . Lo que es tan confuso es que la API de Android tiene Activity.getFragmentManager() , pero si está intentando admitir dispositivos antiguos, debe usar Activity.getSupportFragmentManager() . Sin embargo, este problema en particular no se trata de soportar las API más antiguas.

El problema es que tienes una Actividad que tiene un Fragmento que posee el ViewPager que posee varios Fragmentos. ¡Tienes Fragmentos dentro de Fragmentos! El diseño original de Fragments realmente no manejó este caso de uso y más tarde fue actualizado para manejarlo. Cuando tienes Fragmentos dentro de Fragmentos debes usar:

Fragment.getChildFragmentManager()

Desde dentro de un Fragment tienes la opción de Fragment.getFragmentManager() que devuelve el FragmentManager de la Activity vs Fragment.getChildFragmentManager() que devuelve el FragmentManager para este Fragment que escala correctamente el Fragment s dentro de tu Fragment .

  • ¿Asignación de objetos durante el dibujo / diseño?
  • Usos-Permiso vs Usos-Característica
  • Android: Null Pointer Excepción al llamar a una nueva intención
  • Finalización de la construcción de objetos después de la deserialización de GSON
  • ¿Por qué está agregando un OnClickListener dentro onBindViewHolder de un RecyclerView.Adapter considerado mala práctica?
  • Mockito - burlándose de una interfaz - lanzando NullPointerException
  • Cómo iterar Arraylist <HashMap <String, String >>?
  • Cambiar entre un TextView y EditText
  • Cómo anular la barra de acción de nuevo en el botón de android?
  • Android 4.0 / ICS - Icono de la aplicación en la barra de acciones no se puede hacer clic
  • Almacenamiento de etiquetas de música en una base de datos SQLite
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.