Fragmento addToBackStack () y popBackStackImmediate () no funciona

Actualmente estoy construyendo una aplicación para Android (14 <= ​​SDK <= 21) usando una ActionBarActivity y más Fragments , como ListFragment y MapFragment , que se intercambian dentro de una única vista de FrameLayout .

El ActionBarActivity automáticamente reemplaza / confirma el fragmento A. Entonces, cuando el usuario pulsa un botón, la actividad de alojamiento reemplaza / confirma un nuevo fragmento B. Mi objetivo es dejar que el usuario vuelva al fragmento A tan pronto como presiona el botón de retroceso .

Algún código ahora.

Actividad principal

 public class MainActivity extends ActionBarActivity implements StopFragment.OnFragmentInteractionListener, StopItemFragment.OnFragmentInteractionListener { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentManager = getFragmentManager(); fragmentManager.enableDebugLogging(true); ... if (fragmentManager.findFragmentById(R.id.content_frame) == null) { StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment fragmentManager.beginTransaction() .replace(R.id.content_frame, list) .addToBackStack(null) .commit(); } ... @Override public void onFragmentInteraction(String id) { selectItem(Integer.parseInt(id)); } private void selectItem(int position) { StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment ... fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .commit(); ... } } 

Problema

Incluso si se llama addToBackStack() , cuando estoy en el fragmento B, no puedo volver al fragmento A. MainActivity está cerrado directamente. Sin embargo, traté de manejar la pila de espalda por mí mismo sin suerte. Puedo ver que el fragmento está en la pila pero si llamo a popBackStackImmediate() , el fragmento A se saca hacia fuera y la transacción del fragmento no se realiza. (La primera copia no sucede nada, la segunda actividad cerrada)

También adjunto el logcat FragmentManager:
Http://pastebin.com/hFLHprL8

Para aquellos, que todavía están buscando la solución.

En la clase de Activity principal (que está alojando los fragmentos) simplemente anule onBackPressed() .

 @Override public void onBackPressed() { if (getFragmentManager().getBackStackEntryCount() > 0 ){ getFragmentManager().popBackStack(); } else { super.onBackPressed(); } } 

No hay onBackPressed() método onBackPressed() en el fragmento, y este método es sólo para la activity . Por lo tanto, cuando presionamos la tecla de retroceso, se muestra el comportamiento predeterminado de activity , que es

O bien ir a la actividad anterior (si hay alguna) o la aplicación se cerrará.

Ahora necesitamos anular este método para decirle a la activity que cuando presionamos la tecla de retroceso, si hay fragmentos en la pila de la espalda, pop out (y esto es cuando el addToBackStack() entra en imagen). De lo contrario siga el comportamiento predeterminado.

Prueba esto (Nota add no reemplazar para fragmentA, y addToBackStack () para fragmentB)

 StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment fragmentManager.beginTransaction() .add(R.id.content_frame, list) .commit(); 

y

 StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment ... fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .addToBackStack("FragmentB") .commit(); 

Tuve que llamar a beginTransaction() y commit() de FragmentManager manualmente.
Resuelto por sobreescribir onBackPressed() :

 @Override public void onBackPressed() { ... if (fragmentManager.getBackStackEntryCount() > 1){ fragmentManager.popBackStackImmediate(); fragmentManager.beginTransaction().commit(); } else { //handle finish finish(); // Closes app } } 

Si usted está luchando con addToBackStack () & popBackStack (), simplemente utilice

 FragmentTransaction ft =getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content_frame, new HomeFragment(), "Home"); ft.commit();` 

En tu actividad En OnBackPressed () descubre fargment por etiqueta y luego haz tus cosas

 Fragment home = getSupportFragmentManager().findFragmentByTag("Home"); if (home instanceof HomeFragment && home.isVisible()) { // do you stuff } 

Para más información https://github.com/DattaHujare/NavigationDrawer Nunca utilizo addToBackStack () para manejar el fragmento.

  • Android - Utilizar el dedo de izquierda a derecha para volver
  • noHistory vs finish () - ¿Cuál es preferido?
  • Borra toda la pila de historiales e inicia una nueva actividad en Android
  • Android: accede a la pila de actividades mediante programación
  • La presión no regresa al fragmento anterior
  • ¿Cómo obtener una lista de entradas de fragmentos backstack en android?
  • ¿Cuál es el propósito de "FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET" al compartir?
  • Android - lanzador y comportamiento de la pila trasera
  • La forma correcta de manejar la navegación "Up" de acuerdo con las directrices
  • Ocultación de las pestañas de la acciónBar con el modo de navegación que afecta negativamente a la fragilidad de fragmento
  • Botón Atrás cerrar la aplicación incluso cuando se utiliza FragmentTransaction.addToBackStack ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.