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 conservar la pila trasera actual (o tarea) cuando se hace clic en la notificación?
- Fragmento de PopBackStack
- Ocultación de las pestañas de la acciónBar con el modo de navegación que afecta negativamente a la fragilidad de fragmento
- Android: Impedir volver a la actividad anterior
- ¿Cómo excluir de una actividad exportada?
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(); }
- Fragmentos onResume de la pila trasera
- Cómo persistir los datos de fragmentos después de las transacciones backstack?
- Android: Fragmento de diálogo y problemas de Backstack
- Imprimir la pila trasera actual en el registro
- Se reanuda el fragmento que no es el más alto en backstack
- Android - Utilizar el dedo de izquierda a derecha para volver
- Borrar backstack y reemplazar fragmento actual con un fragmento de nivel superior
- Android: cómo volver a la actividad con el atributo "noHistory" después de onStop?
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