todas studio pila las intent finish every destruir close borrar all activity actividades android android-fragments fragment fragment-backstack

pila - finish all activity android studio



Cómo eliminar un fragmento específico de la pila trasera en Android (6)

Código para el Fragmento A -> Fragmento B :

Agregue el Fragmento A en BackStack of Fragments

FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.frame_layout_container, new fragmentB()); fragmentTransaction.addToBackStack(null); fragmentTransaction.commit();

Código para el Fragmento B -> Fragmento C :

No agregue el fragmento B en la pila posterior de fragmentos

FragmentManager fragmentManager = getFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.frame_layout_container, new fragmentC()); fragmentTransaction.commit();

Funcionará de esta manera: A -> B -> C y mientras se devuelve C-> A como lo haya exceptuado.

Espero que te ayude.

Tengo un problema con la eliminación de un fragmento específico de la pila posterior. Mi escenario es así. El Fragmento 1 se reemplaza con el Fragmento 2 y luego el Fragmento 2 se reemplaza con el Fragmento 3.

Orden de llamada; Fragmento-1 -> Fragmento-2 -> Fragmento-3.

Cuando Fragment-3 está en la pantalla y luego se hace clic en el botón Atrás, quiero ir

Fragmento-1. Eso significa que quiero eliminar Fragmento-2 de la pila trasera.

Como hacer esto ?


Se agrega al estado posterior de FragmentTransaction y se elimina de la parte posterior utilizando métodos emergentes de FragmentManager :

FragmentManager manager = getActivity().getSupportFragmentManager(); FragmentTransaction trans = manager.beginTransaction(); trans.remove(myFrag); trans.commit(); manager.popBackStack();

O

Simplemente puede omitir que el fragmento se agregue a la pila de fragmentos, de modo que cuando regrese del Fragment-3 volverá al Fragment-1

Actualizado :

Para deshabilitar la animación, debe anular el método onCreateAnimation ...

@Override public Animation onCreateAnimation(int transit, boolean enter, int nextAnim) { if (disableAnim) { Animation a = new Animation() {}; a.setDuration(0); return a; } return super.onCreateAnimation(transit, enter, nextAnim); }


Si está agregando / lanzando los tres fragmentos en la misma actividad, en lugar del método add() de FragmentTransaction para mostrar Fragment3, use el método replace() de FragmentTransaction (reemplace Fragment2 con Fragment3). El método de replace elimina el fragmento actual de Backstack antes de agregar el nuevo fragmento. Si está iniciando Fragment3 desde una actividad diferente y, por lo tanto, no puede / no quiere usar replace() , elimine Fragment2 del backstack antes de comenzar la nueva actividad (que agrega el fragmento 3):

// in Fragment2, before adding Fragment3: FragmentManager fragmentManager = getFragmentManager(); fragmentManager.beginTransaction() .remove(this) // "this" refers to current instance of Fragment2 .commit(); fragmentManager.popBackStack(); // now go ahead and launch (add) fragment3 // if fragment3 is launched from a different activity, // start that activity instead fragmentManager.beginTransaction() .add(R.id.a_container_view_in_activity, new Fragment3(), Fargment3.FRAGMENT3_ID) .commit();


Tuve un escenario muy similar al tuyo, mi solución era solo verificar la cantidad de transacciones de BackStack que tenía.

Si las transacciones fueran más de 0, simplemente lo haría estallar de inmediato para que se omitiera al presionar hacia atrás.

if (getSupportFragmentManager().getBackStackEntryCount() > 0) { getSupportFragmentManager().popBackStackImmediate(); } ... fragmentTransaction.replace(R.id.main_fragment, newFrag, MAIN_FRAGMENT_TAG); fragmentTransaction.addToBackStack(null); fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); fragmentTransaction.commit();

Esto haría con éxito:

  • A -> B (atrás presionada) -> de nuevo a A

  • A -> B -> C (atrás presionada) -> atrás a A

El único inconveniente que veo es que hay un destello rápido donde se muestra el fragmento A antes de pasar al fragmento C.


En el backstack no tienes Fragment s, sino FragmentTransaction s. Cuando popBackStack() la transacción se aplica de nuevo, pero hacia atrás. Esto significa que (suponiendo que addToBackStackTrace(null) cada vez) en su backstack tiene

1->2 2->3

Si no agrega la segunda transacción al backstack, el resultado es que su backstack es simplemente

1->2

y así, presionar el botón Atrás causará la ejecución de 2->1 , lo que lleva a un error debido a que el fragmento 2 no está allí (está en el fragmento 3).
La solución más fácil es hacer estallar el backstack antes de pasar de 2 a 3.

//from fragment-2: getFragmentManager().popBackStack(); getFragmentManager().beginTransaction() .replace(R.id.container, fragment3) .addToBackStack(null) .commit();

Lo que estoy haciendo aquí es esto: del fragmento 2 vuelvo al fragmento 1 y luego directamente al fragmento 3. De esta forma, el botón Atrás me llevará de 3 a 1.


for (int i = 0; i < mFragmentManager.getBackStackEntryCount(); i++) { currentFragment = mFragmentManager.getFragments().get(i); if (!(currentFragment instanceof ParticularFragment)) mFragmentManager.popBackStack(); else break; }