popbackstack from fragments delete backstack addtobackstack android android-fragments back-stack

android - from - pop fragment



Fragmento addToBackStack() y popBackStackImmediate() no funcionan (5)

Intente esto (nota agregue no reemplace para fragmentA, y addToBackStack () para fragmentB)

StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment fragmentManager.beginTransaction() .add(R.id.content_frame, list) .commit();

y

StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment ... fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .addToBackStack("FragmentB") .commit();

Actualmente estoy creando una aplicación para Android (14 <= ​​SDK <= 21) usando una ActionBarActivity y más Fragments , como ListFragment y MapFragment , que se intercambian dentro de una sola vista FrameLayout .

La ActionBarActivity reemplaza / confirma automáticamente el fragmento A. Luego, cuando el usuario toca un botón, la Actividad de alojamiento reemplaza / confirma un nuevo fragmento B. Mi objetivo es permitir que la usuaria vuelva al fragmento A tan pronto como presiona el botón Atrás .

Algún código ahora.

Actividad principal

public class MainActivity extends ActionBarActivity implements StopFragment.OnFragmentInteractionListener, StopItemFragment.OnFragmentInteractionListener { ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); fragmentManager = getFragmentManager(); fragmentManager.enableDebugLogging(true); ... if (fragmentManager.findFragmentById(R.id.content_frame) == null) { StopItemFragment list = StopItemFragment.newInstance(null); //A - extends ListFragment fragmentManager.beginTransaction() .replace(R.id.content_frame, list) .addToBackStack(null) .commit(); } ... @Override public void onFragmentInteraction(String id) { selectItem(Integer.parseInt(id)); } private void selectItem(int position) { StopFragment fragment = StopFragment.newInstance(null, null); //B - extends Fragment ... fragmentManager.beginTransaction() .replace(R.id.content_frame, fragment) .commit(); ... } }


Problema

Incluso si se llama a addToBackStack() , cuando estoy en el fragmento B, no puedo volver al fragmento A. MainActivity está directamente cerrado. Sin embargo, traté de manejar la pila trasera por mi cuenta sin suerte. Puedo ver que el fragmento está en la pila pero si llamo a popBackStackImmediate() , el fragmento A se salta y la transacción del fragmento no se realiza. (primera pulsación atrás no pasa nada, segunda actividad cerrada)

Adjunto también el logcat FragmentManager:
http://pastebin.com/hFLHprL8


Para aquellos, que todavía están buscando solución.

En la clase de Activity principal (que alberga los fragmentos), simplemente anule onBackPressed() .

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

No hay onBackPressed() método onBackPressed() en el fragmento, y este método es solo para la activity . Entonces, cuando presionamos la tecla Atrás, se muestra el comportamiento predeterminado de la activity , que es

irá a la actividad anterior (si hay alguna) o la aplicación se cerrará.

Ahora debemos anular este método para indicar a la activity que cuando presionamos la tecla de retroceso, si hay fragmentos en la pila de atrás, los saque (y esto es cuando el addToBackStack() aparece en la imagen). De lo contrario, siga el comportamiento predeterminado.


Si está luchando con addToBackStack () & popBackStack (), simplemente use

FragmentTransaction ft =getSupportFragmentManager().beginTransaction(); ft.replace(R.id.content_frame, new HomeFragment(), "Home"); ft.commit();`

En tu actividad en OnBackPressed () encuentra texto por etiqueta y luego haz tus cosas

Fragment home = getSupportFragmentManager().findFragmentByTag("Home"); if (home instanceof HomeFragment && home.isVisible()) { // do you stuff }

Para obtener más información https://github.com/DattaHujare/NavigationDrawer , nunca uso addToBackStack () para manejar el fragmento.


Tuve que llamar a beginTransaction() y commit() de FragmentManager manualmente.
Resuelto anulando onBackPressed() :

@Override public void onBackPressed() { ... if (fragmentManager.getBackStackEntryCount() > 1){ fragmentManager.popBackStackImmediate(); fragmentManager.beginTransaction().commit(); } else { //handle finish finish(); // Closes app } }


la razón por la que popBackStack() y popBackStackImmediatly() se debe al hecho de que no agregó ese fragmento (que desea hacer estallar) a la BackStack. Para hacer esto, debe realizar una llamada a addToBackStack () en el momento de realizar la transacción para agregar / reemplazar su fragmento.