Android: Regresar al fragmento anterior en la parte posterior de la prensa

He implementado el Cajón de navegación que es una subclase de Actividad. Tengo muchos fragmentos en mi aplicación. Mi pregunta va aquí

Imagínese que hay 3 fragmentos:

Fragmento_1: Fragmento_2: Fragmento_3

Cuando inicio mi aplicación, Fragment_1 se carga Cuando hago clic en algunos componentes en Fragment_1, me dirigen a Fragment_2 y así sucesivamente ..

Asi que es como

Fragmento_1> Fragmento_2> Fragmento_3

Cuando presiono la tecla de regreso de Fragment_2, me vuelven a navegar a Fragment_1. Pero cuando presiono la tecla de Fragment_3, vuelvo a Fragment_1 (en lugar de Fragment_2)

Quiero algo como esto en mi aplicación en Back Key Press

Fragmento_1 <Fragmento_2 <Fragmento_3

He utilizado Fragment, FragmentManager, FragmentTransaction de la siguiente manera:

MyFragment fragment = new MyFragment(); FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction().replace(R.id.content_frame, fragment).addToBackStack(null)commit(); 

Y traté de reemplazar onBackPressed () en mi MainActivity:

 @Override public void onBackPressed() { getFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); int count = getFragmentManager().getBackStackEntryCount(); if (count == 0) super.onBackPressed(); } 

Actualice su método Activity#onBackPressed() para:

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

La razón de su implementación no funciona es porque el método FragmentManager#popBackStack() es asíncrono y no sucede justo después de que se llama.

De la documentación:

Esta función es asíncrona – encuerda la solicitud de pop, pero la acción no se realizará hasta que la aplicación vuelva a su bucle de eventos.

Referencia: http://developer.android.com/reference/android/app/FragmentManager.html#popBackStack(java.lang.String,%20int)

Tienes que implementar tu propia implementación de backstack como se explica aquí

Separa la pila trasera de cada pestaña en Android mediante Fragmentos

Puede llamar a los popFragments () cada vez que haga clic en el botón Atrás en un fragmento y llame a pushFragments () cuando navegue de un fragmento a otro.

en breve,

 public void onBackPressed() { FragmentManager fm = getActivity().getSupportFragmentManager(); fm.popBackStack(); } 

El tric está en FragmentManager#executePendingTransactions(); .

Esto es lo que yo uso para los fragmentos anidados también …:

 /** * if there is a fragment and the back stack of this fragment is not empty, * then emulate 'onBackPressed' behaviour, because in default, it is not working. * * @param fm the fragment manager to which we will try to dispatch the back pressed event. * @return {@code true} if the onBackPressed event was consumed by a child fragment, otherwise */ public static boolean dispatchOnBackPressedToFragments(FragmentManager fm) { List<Fragment> fragments = fm.getFragments(); boolean result; if (fragments != null && !fragments.isEmpty()) { for (Fragment frag : fragments) { if (frag != null && frag.isAdded() && frag.getChildFragmentManager() != null) { // go to the next level of child fragments. result = dispatchOnBackPressedToFragments(frag.getChildFragmentManager()); if (result) return true; } } } // if the back stack is not empty then we pop the last transaction. if (fm.getBackStackEntryCount() > 0) { fm.popBackStack(); fm.executePendingTransactions(); return true; } return false; } 

Y en mi onBackPressed :

  if (!FragmentUtils.dispatchOnBackPressedToFragments(fm)) { // if no child fragment consumed the onBackPressed event, // we execute the default behaviour. super.onBackPressed(); } 

Utilice este código en el cambio de ficha en su actividad principal para borrar la pila.

 int count = getFragmentManager().getBackStackEntryCount(); if(count>0){ for (int i = 0; i <count; i++) { getFragmentManager().popBackStack(); } } 

Entonces en la parte posterior presionada de su actividad principal haga esto

  int count = getFragmentManager().getBackStackEntryCount(); if (count == 0) { super.onbackpressed(); } else { getFragmentManager().popBackStack(); } } 

Aquí está trabajando y probado el código por mí, Esto le ayudará

  private static final int TIME_INTERVAL = 2000; private long mBackPressed; private void applyExit() { if (mBackPressed + TIME_INTERVAL > System.currentTimeMillis()) { finish(); } else { Toast.makeText(this,"Press Again to exit",Toast.LENGTH_LONG).show(); } mBackPressed = System.currentTimeMillis(); } @Override public void onBackPressed() { fm = getSupportFragmentManager(); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } if (fm.getFragments().size() <= 1) { applyExit(); } else { for (Fragment frag : fm.getFragments()) { if (frag == null) { applyExit(); return; } if (frag.isVisible()) { FragmentManager childFm = frag.getChildFragmentManager(); if (childFm.getFragments() == null) { super.onBackPressed(); return; } if (childFm.getBackStackEntryCount() > 0) { childFm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); return; } else { fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); return; } } } } } 
  • Cómo averiguar si la actividad es la última actividad en la pila
  • Detener fragmento de ser recreado después de reanudar?
  • PopBackStack hace que llamar a oncreateView del fragmento una y otra vez
  • Android: BackStack se comporta mal, si la aplicación se inició desde otra aplicación
  • Cómo borrar backStack de soporte FragmentManager?
  • PopBackStack pero mantener el primer fragmento en android
  • Borrar la pila trasera cuando el objeto de la aplicación es eliminado por el sistema
  • Usar backstack con ViewPager
  • Problemas con Android Fragment pila trasera
  • El comportamiento de popBackStack () difiere después de la actualización de la biblioteca de soporte de 23.1.1 a 25.1.0
  • Métodos de fragmento: attach (), detach (), remove (), replace (), popBackStack ()
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.