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:
- Es tener que pasar el contexto a la mayoría de las clases un signo de mal diseño?
- ¿Cómo crear un par de claves ECDSA (256bit) para la curva bitcoin (secp256k1) usando castillo esponjoso?
- ¿Problemas comunes de rendimiento en Android?
- ¿Por qué está el menú desplegable de desbordamiento encima de la barra de acción?
- GetAvailableBlocksLong () * getBlockSizeLong () VS getAvailableBytes ()
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
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 .
- Clase no encontrada al desmarcar: android.support.v7.widget.Toolbar $ SavedState
- Android O casting para findViewById ya no es necesario?
- Qt - el paquete android.support.v4.app no existe
- Utilizar ADB para capturar la pantalla
- Dagger 2: @ Component.Builder falta setters para los módulos o componentes necesarios: `
- ¿Cómo agregar un fragmento en mi actividad dinámicamente?
- Cómo imprimir local timezone en formato posix en java (android)?
- Generar una imagen con texto personalizado en Android
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
.
- Cordova – se niega a ejecutar el controlador de eventos en línea porque viola el siguiente contenido Política de seguridad
- Cómo definir ColorStateList para TextView?