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.