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:
- Cómo Reverse Fragment animaciones en BackStack?
- Android: abrir la actividad sin guardar en la pila
- TabLayout ViewPager no carga al utilizar Backstack
- ¿Cómo aplastar fragmentos en el backstack que coinciden con su etiqueta de fragmento?
- Android: BackStack se comporta mal, si la aplicación se inició desde otra aplicación
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(); }
- Cómo quitar la entrada anterior de la pila trasera de FragmentManager?
- noHistory vs finish () - ¿Cuál es preferido?
- Fragmentos onResume de la pila trasera
- Cómo estallar fragmento de backstack
- Borra toda la pila de historiales e inicia una nueva actividad en Android
- Android: borra todas las actividades del backstack y termina la actividad actual
- Mal comportamiento de Backstack de la actividad cuando la actividad destruida
- Borrar actividad back stack
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.
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 detener la barra de navegación de ActionBar para mostrar como un hilandero cuando llega demasiado tiempo?
- Cómo crear un PopupMenu personalizado en Android