¿Cómo evitar la recreación de fragmentos cuando se selecciona de NavigationDrawer?

Tengo una actividad simple en la que está alojado un cajón de navegación. Una de sus entradas es un WebView, que tiene mucho que cargar (muestra Gmail, de modo que después de todos esos desagradables redireccionamientos se necesita mucho).

Me gustaría conservar el fragmento incluso cuando se producen diferentes selecciones. Pensé que estas soluciones podrían funcionar. No lo hicieron.

1) No volver a crear el fragmento: incluso si mWebmailFragment realmente no es nulo , onCreateView () se llama en cualquier caso.

private Fragment mWebmailFragment /*, the others */; public void selectItem(int position) { Fragment fragment = null; switch (position) { case FRAGMENT_CODE_WEBMAIL: mWebmailFragment = mWebmailFragment!=null ? mWebmailFragment : new WebmailFragment(); fragment = mWebmailFragment; break; // ... } 

2) si se llama a onCreateView (), el mantenimiento del estado del objeto WebView puede funcionar. Bueno, no: depuración descubrí que savedInstanceState siempre es nulo. No sé por qué.

 public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { super.onCreateView(inflater, container, savedInstanceState); // Retain instance setRetainInstance(true); //.... // SavedState if (savedInstanceState != null) { mWebView.restoreState(savedInstanceState); } else { // do stuff } } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); mWebView.saveState(outState); } 

Creo que no has usado ocultar / mostrar correctamente. En su fragmento de transacción use add () para cargar el fragmento en lugar de replace ().

Cambia esto

 final FragmentManager myFragmentManger = myContext .getSupportFragmentManager(); final FragmentTransaction myFragmentTransaction = myFragmentManger .beginTransaction(); myFragmentTransaction.replace(R.id.content, aFragment, aFragmentTag.getFragment()); 

a

 final FragmentManager myFragmentManger = myContext .getSupportFragmentManager(); final FragmentTransaction myFragmentTransaction = myFragmentManger .beginTransaction(); myFragmentTransaction.add(R.id.content, aFragment, aFragmentTag.getFragment()); 

Si utiliza replace, createview () de fragmento se llamará cada vez. Trate de usar el add () como el código anterior.

  • Hacer clic en icono de hamburguesa en la barra de herramientas no abre Cajón de navegación
  • Android: ¿Es mejor crear un nuevo fragmento cada vez que se hace clic en un elemento del cajón de navegación o cargar fragmentos creados anteriormente?
  • ¿Cómo puedo hacer que DrawerLayout se muestre debajo de la barra de herramientas?
  • Cambiar entre la imagen de la gaveta de navegación de Android y el cursor hacia arriba al utilizar fragmentos
  • Adición de una imagen grande a un cajón de navegación (SlidingMenu libs) - ¿Cómo?
  • Desplazamiento de izquierda a derecha con el visor y el cajón de navegación
  • Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
  • Cómo agregar iconos adyacentes a los títulos de Android Navigation Drawer
  • ActionLayout para los elementos de la vista de navegación se muestra en el lado derecho
  • El cajón de navegación se cierra al hacer clic
  • Cómo diseñar o diseñar correctamente un cajón de navegación de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.