2012-09-26 15 views
5

Estoy desarrollando una aplicación sencilla basada en fragmentos con un FragmentActivity singe. Cada 'pantalla' de la aplicación está contenida en un fragmento y todos los fragmentos se agregan al diseño del contenedor al inicio de la aplicación.Android - El botón de retroceso y el fragmento de fragmentos no funcionan

// Set up fragments in Main Activity 
fragMan = getFragmentManager(); 
FragmentTransaction ft = fragMan.beginTransaction(); 
ft.add(R.id.fragment_container, settingsFragment); 
ft.add(R.id.fragment_container, mapFragment); 
ft.add(R.id.fragment_container, tracksFragment); 
ft.add(R.id.fragment_container, waypointsFragment); 
ft.commit(); 

Las transiciones se logran ocultando el fragmento visible en ese momento, y luego mostrando el fragmento apropiado.

ft = fragMan.beginTransaction(); 
ft.show(mapFragment); 
ft.addToBackStack(null); 
ft.commit(); 

Todo esto funciona bien, pero cuando se pulsa el botón de retroceso, se cierra la aplicación, independientemente de qué pantalla es visible o lo transacciones anteriores se han añadido a la pila de vuelta.

He comprobado para asegurarse de que la pila trasera está acumulando correctamente los registros y he probado muchas variaciones de métodos de transición como reemplazar fragmentos en lugar de ocultarlos/mostrarlos, crear nuevas instancias de fragmentos en lugar de almacenarlos en variables, etc. Por lo que puedo decir, mi código coincide con todos los tutoriales y ejemplos que puedo encontrar, y ni siquiera he podido encontrar preguntas similares/ejemplos de problemas similares, presumiblemente porque la implementación estándar "simplemente funciona" para otros.

Sospecho que puede ser un problema a nivel de aplicación, como una propiedad en mi manifiesto (que he investigado bastante) o algo inherente a la forma en que se configura mi aplicación que impide que el botón de retroceso funcione correctamente . Puedo sobrescribir onBackPressed para manejar las transiciones de forma manual, pero esto parece una solución bastante desagradable. ¿Alguna idea de por qué esto podría no estar comportándose como se esperaba? Por cierto, esto es en un Nexus 7 que ejecuta Jelly Bean.

Respuesta

0

No estoy seguro si esto solucionará su problema, pero no creo que deba agregar todos los fragmentos para empezar.

También he notado (al menos con la biblioteca de compatibilidad) que el método de reemplazo parece tener errores, así que lo mejor es eliminar primero el fragmento existente y luego agregar el nuevo.

Aquí es el trozo de código que utilizo para cambiar un fragmento:

/** 
* Changes the detail fragment of this activity. This is how all content is presented in this app. 
* @param fragment 
* @param animated 
* @param addCurrentFragmentToBackStack 
*/ 
private void changeDetailFragment(Fragment fragment,boolean animated,boolean addCurrentFragmentToBackStack) 
{ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 

     if (animated) 
      transaction.setCustomAnimations(android.R.anim.fade_in, android.R.anim.fade_out); 

    Fragment currentFrag = getSupportFragmentManager().findFragmentById(R.id.detailFragment); 


    String fragName = "NONE"; 

    if (currentFrag!=null) 
     fragName = currentFrag.getClass().getSimpleName(); 


    if (currentFrag != null) 
    { 

     transaction.remove(currentFrag); 
    } 


    transaction.add(R.id.detailFragment,fragment); 


    if (addCurrentFragmentToBackStack) 
    { 
     Log.i("APP_NAME","Adding: " + fragName + " to the backstack"); 
     transaction.addToBackStack(null); 
    } 
    else 
    { 
     Log.i("APP_NAME","Not adding: " + fragName + " to the backstack"); 
    } 



    transaction.commit(); 

} 

Espero que esto ayude.

2

Compruebe si está utilizando FragmentActivity (de la biblioteca de soporte) en lugar de Activity. Esto causará problemas de backstack y transición.

Cuestiones relacionadas