tutorial studio navegar fragments example entre ejemplo activity android android-fragments

android - studio - Borrar la pila de atrás usando fragmentos



java android fragment (13)

Solo use este método y pase la etiqueta Contexto y Fragmento hasta la cual necesitamos eliminar los fragmentos de respaldo.

Uso

clearFragmentByTag(context, FragmentName.class.getName()); public static void clearFragmentByTag(Context context, String tag) { try { FragmentManager fm = ((AppCompatActivity) context).getSupportFragmentManager(); for (int i = fm.getBackStackEntryCount() - 1; i >= 0; i--) { String backEntry = fm.getBackStackEntryAt(i).getName(); if (backEntry.equals(tag)) { break; } else { fm.popBackStack(); } } } catch (Exception e) { System.out.print("!====Popbackstack error : " + e); e.printStackTrace(); } }

Porté mi aplicación de Android a Honeycomb e hice un gran refactor para usar fragmentos. En mi versión anterior, cuando presioné el botón de Inicio, solía hacer un ACTIVITY_CLEAR_TOP para restablecer la pila trasera.

Ahora mi aplicación es solo una actividad con varios fragmentos, así que cuando presiono el botón de inicio, solo reemplazo uno de los fragmentos que contiene. ¿Cómo puedo limpiar mi pila trasera sin tener que usar startActivity con el indicador ACTIVITY_CLEAR_TOP ?


Claro backstack sin bucles

String name = getSupportFragmentManager().getBackStackEntryAt(0).getName(); getSupportFragmentManager().popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE);

Donde nombre es el parámetro addToBackStack ()

getSupportFragmentManager().beginTransaction(). .replace(R.id.container, fragments.get(titleCode)) .addToBackStack(name)


Con el debido respeto a todas las partes involucradas; Estoy muy sorprendido de ver cuántos de ustedes podrían borrar toda la pila de fragmentos con una simple

fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

De acuerdo con la documentación de Android (en relación con el argumento del name , el "nulo" en las propuestas de trabajo reclamadas).

Si es nulo, solo se muestra el estado superior

Ahora, me doy cuenta de que carezco de conocimiento de sus implementaciones particulares (como cuántas entradas tiene en la parte de atrás en el momento dado), pero apostaría todo mi dinero en la respuesta aceptada cuando espero una respuesta correcta. Comportamiento en una amplia gama de dispositivos y proveedores:

(para referencia, algo junto con esto)

FragmentManager fm = getFragmentManager(); // or ''getSupportFragmentManager();'' int count = fm.getBackStackEntryCount(); for(int i = 0; i < count; ++i) { fm.popBackStack(); }


Conseguí esto trabajando de esta manera:

public void showHome() { getHandler().post(new Runnable() { @Override public void run() { final FragmentManager fm = getSupportFragmentManager(); while (fm.getBackStackEntryCount() > 0) { fm.popBackStackImmediate(); } } }); }


Funciona para mi y de manera fácil sin usar loop

FragmentManager fragmentManager = getSupportFragmentManager(); //this will clear the back stack and displays no animation on the screen fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);


Hola ~ Encontré una solución que es mucho mejor, desde: https://gist.github.com/ikew0ng/8297033

/** * Remove all entries from the backStack of this fragmentManager. * * @param fragmentManager the fragmentManager to clear. */ private void clearBackStack(FragmentManager fragmentManager) { if (fragmentManager.getBackStackEntryCount() > 0) { FragmentManager.BackStackEntry entry = fragmentManager.getBackStackEntryAt(0); fragmentManager.popBackStack(entry.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); } }


La respuesta aceptada no fue suficiente para mí. Tuve que usar:

FragmentManager fm = getSupportFragmentManager(); int count = fm.getBackStackEntryCount(); for(int i = 0; i < count; ++i) { fm.popBackStackImmediate(); }


Leyendo la documentation y estudiando qué es el ID del fragmento, parece ser simplemente el índice de pila, así que esto funciona:

fragmentManager.popBackStackImmediate(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);

Cero ( 0 ) es la parte inferior de la pila, por lo que al abrirla se borra la pila.

CAVEAT: Aunque lo anterior funciona en mi programa, dudo un poco porque la documentación de FragmentManager nunca establece que el ID sea el índice de la pila. Tiene sentido que lo sea, y todos mis registros de depuración se dan cuenta de que lo es, pero tal vez en alguna circunstancia especial, ¿no? ¿Alguien puede confirmar esto de una manera u otra? Si es así, entonces lo anterior es la mejor solución. Si no, esta es la alternativa:

while(fragmentManager.getBackStackEntryCount() > 0) { fragmentManager.popBackStackImmediate(); }


Para hacer una respuesta al comentario de @ Warpzit y hacer que sea más fácil de encontrar para otros.

Utilizar:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);


Sólo quería añadir:

Saltando de backstack usando lo siguiente

fragmentManager.popBackStack ()

solo se trata de eliminar los fragmentos de la transacción, de ninguna manera va a eliminar el fragmento de la pantalla. Entonces, idealmente, puede que no sea visible para usted, pero puede haber dos o tres fragmentos apilados uno sobre el otro, y al presionar la tecla Atrás, la IU puede verse desordenada, apilada.

Solo tomando un ejemplo simple:

Supongamos que tiene un fragmento A que carga Fragmnet B utilizando fragmentmanager.replace () y luego hacemos addToBackStack, para guardar esta transacción. Así que el flujo es: -

PASO 1 -> Fragmento A -> Fragmento B (nos movimos a Fragmento B, pero el Fragmento A está en el fondo, no es visible).

Ahora realiza algún trabajo en fragmentB y presiona el botón Guardar, que después de guardar debería volver a fragmentA.

PASO 2-> Al guardar FragmentB, volvemos a FragmentA.

PASO 3 -> Un error tan común sería ... en el Fragmento B, haremos el Fragmento Manager.replace () fragmentoB con fragmentoA.

Pero lo que realmente está sucediendo, estamos cargando Fragmento A de nuevo, reemplazando FragmentB. Así que ahora hay dos FragmentA (uno de STEP-1, y uno de este STEP-3).

Dos instancias de FragmentsA se apilan una sobre otra, lo que puede no ser visible, pero está ahí.

Entonces, incluso si eliminamos el backstack mediante los métodos anteriores, la transacción se borra pero no los fragmentos reales. Entonces, idealmente en un caso particular, al presionar el botón de guardar, simplemente necesita volver a fragmentA simplemente haciendo fm.popBackStack () o fm.popBackImmediate () .

Por lo tanto, el Paso 3-> fm.popBackStack () correcto vuelve a fragmentA, que ya está en la memoria.


Publiqué algo similar aquí

De la respuesta de Joachim, de Dianne Hackborn:

http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42

Terminé simplemente usando:

FragmentManager fm = getActivity().getSupportFragmentManager(); for(int i = 0; i < fm.getBackStackEntryCount(); ++i) { fm.popBackStack(); }

Pero igualmente podría haber usado algo como:

FragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE)

Lo que hará estallar todos los estados hasta el nombre. Entonces puedes simplemente reemplazar el fragmento con lo que quieras


private void clearBackStack(){ SupportFragmentManaer fm = getSupportFragmentManager(); fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); }

Llamar a este método sería muy ordenado.

  1. No se requiere bucle.
  2. Si está utilizando animación en fragmentos, no mostrará demasiadas animaciones. Pero el uso de bucle lo hará.

private boolean removeFragFromBackStack() { try { FragmentManager manager = getSupportFragmentManager(); List<Fragment> fragsList = manager.getFragments(); if (fragsList.size() == 0) { return true; } manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE); return true; } catch (Exception e) { e.printStackTrace(); } return false; }