2012-08-04 12 views
7

En mi actividad principal, tengo una barra de acciones con NAVIGATION_MODE_TABS. El contenido de cada pestaña es un listfragment.Fragmentar transacciones, barra de acciones y backstack

Me gustaría que cuando se haga clic en un elemento de lista, se visualice un nuevo fragmento y el modo de barra de acciones se cambie a NAVIGATION_MODE_STANDARD (de modo que las pestañas estén ahora ocultas).

he logrado conseguir que esto funcione con el siguiente código:

En el método listitemclick:

 ActionBar actionBar = getActivity().getActionBar(); 
     actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD); 

     Fragment albumListFragment = new AlbumListFragment(); 
     albumListFragment.setArguments(bundle); 
     FragmentTransaction ft = getFragmentManager().beginTransaction(); 

     ft.replace(android.R.id.content, albumListFragment); 
     ft.addToBackStack(null); 

     // Commit the transaction 
     ft.commit(); 

     Log.i("FragmentList", "Item clicked: " + id); 

El problema es cuando se presiona el botón de retroceso, las pestañas están todavía desaparecido, y el fragmento anterior no vuelve a aparecer.

Estoy haciendo algo mal .. ¿Tiene algo que ver con el fragmento de backstack? ¿Debo hacerlo de otra manera, o incluso anular la contrapresión?

--Edit--

Para mayor claridad - Estoy llamando addToBackStack cuando llamo fragmenttransaction.replace, pero al pulsar el botón de retroceso, el fragmento anterior no se restablece.

+0

revise este enlace una vez http://www.vogella.com/articles/Android/article.html#fragments_tutorial – shassss

+0

Gracias, pero no particularmente útil para esta pregunta .. –

+0

Usando addToBackStack es lo que quiere. http://developer.android.com/guide/components/fragments.html#Transactions – Frohnzie

Respuesta

-1

El backstack finaliza la actividad actual y va a la actividad anterior, no al fragmento anterior. (Consulte la guía de la placa trasera: http://developer.android.com/guide/components/tasks-and-back-stack.html).

Podría forzar, como sugirió, el comportamiento anulando onBackPressed, sin embargo, no sé si cambiaría el comportamiento natural de Android de esa forma. Si observa otras aplicaciones, especialmente las principales, que hacen cosas similares, el botón Atrás no va a un fragmento anterior, sino a una actividad previa.

También tiene control total sobre el comportamiento del botón "arriba" (que es el ícono de su aplicación en la barra de acciones con una flecha hacia la izquierda). Tienes que programarlo programáticamente para usarlo como un botón como se describe en la guía de ActionBar (avísame si necesitas saber cómo hacer esto) y con eso podrías tener configurado un fragmento anterior en una pila que tú mantener en alguna parte

+0

De los documentos: antes de llamar a commit(), sin embargo, es posible que desee llamar a addToBackStack(), para agregar la transacción a una pila de transacciones de fragmentos. Esta pila de respaldo es administrada por la actividad y le permite al usuario regresar al estado de fragmento anterior presionando el botón Atrás. – Frohnzie

+0

@Frohnzie gracias por eso, pero el problema es que estoy usando addToBAckStack(), y no está restaurando el fragmento anterior cuando presiono de nuevo. –

+0

@rascuache El código parece correcto. He hecho exactamente lo mismo. No estoy seguro de cuál es el problema. Usar addToBackStack es lo correcto. Tal vez puedas publicar más código. – Frohnzie

0

Experimenté exactamente el mismo problema y me di cuenta de que el problema solo se produce cuando configura la barra de acciones en NAVIGATION_MODE_STANDARD.

La única solución para mí fue colocar el nuevo fragmento sin pestañas en una actividad de ayuda que tiene NAVIGATION_MODE_STANDARD. Luego, puede usar fácilmente la funcionalidad de botón de retroceso proporcionada por Android para volver a la actividad con NAVIGATION_MODE_TABS y conservar su estado.

1

Tal vez esto es un poco tarde, traté de reconstruir su problema durante horas, pero no tuvo éxito. Traté de pasar de una vista de lista en un fragmento alojado por una pestaña ActionBar a otra vista por el camino descrito en su pregunta (es decir, ft.replace (android.R.id.content, albumListFragment);) pero sin efecto. Después de google y stackoverflow, utilizo this way para cambiar el fragmento dentro de la pestaña, pero sin ningún problema.

A medida que la "barra de acción no se muestra correctamente" problema, es probablemente causado por la operación de revertir backstack y el cambio de interfaz de usuario como se describe en android developer guide. puede intentar anular la devolución de llamada onBackStackChanged() y volver a construir la interfaz de usuario.

Como el problema "backstack no devuelve el fragmento anterior", es posible que desee publicar un poco más de código para ayudar a otros a reconstruir el problema para encontrar la respuesta.

Deseo de ser útil.

Cuestiones relacionadas