¿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.

  • El cajón de navegación inhabilita la vista trasera cuando el cajón está abierto
  • Android DrawerLayout.setDrawerLockMode () no funciona
  • Cajón de navegación de estilo de material, el color de la barra de estado se pone demasiado oscuro
  • Desplazamiento de izquierda a derecha con el visor y el cajón de navegación
  • Dimensión de imagen de fondo para la cabecera del cajón de navegación
  • Android: Cajón de navegación en múltiples actividades
  • La barra de notificaciones es gris después de implementar Nav Drawer
  • ¿El cajón de la navegación, manejando el botón trasero para ir a los fragmentos anteriores?
  • Cómo obtener elementos en el cajón de navegación para cambiar la vista
  • Cómo ocultar OptionsMenu en NavigationDrawer utilizando Fragmentos?
  • 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?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.