¿El cajón de la navegación, manejando el botón trasero para ir a los fragmentos anteriores?
Estoy usando el cajón de navegación incorporado para ejecutar mi aplicación. No puedo averiguar cómo manejar el botón de retroceso. Cuando se presiona, quiero que vuelva a cargar el primer fragmento. Fragmento1.
Así que cuando la aplicación se lanza ver Fragment1 lanzado. A continuación, pueden hacer clic en Fragmento 2-5 para ir a otras páginas. Dentro de todas estas páginas quiero que el botón de volver a llevar al usuario de nuevo a Fragmento1. El único lugar que el usuario debe ser capaz de salir de la aplicación a través del botón Atrás es Fragment1.
- Cajón de navegación debajo de la barra de herramientas
- Androide. ¿Cómo puedo deslizar NavigationDrawer de la biblioteca de pruebas Espresso?
- Empuje la actividad a la derecha cuando el cajón abierto
- ¿Cómo utilizar el diseño de material de acción barra de navegación de cajón animación de conmutación?
- La barra de notificaciones es gris después de implementar Nav Drawer
Desde que es manejado por una FragmentActivity intenté jugar con el backbutton allí. Sigo recibiendo un error de cierre de la fuerza sin embargo:
(01-11 14:09:33.114: E/AndroidRuntime(8292): android.view.InflateException: Binary XML file line #7: Error inflating class fragment)
Esto es lo que tengo hasta ahora:
Me he asegurado de agregar los fragmentos a la pila trasera así:
fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
Botón de retroceso:
@Override public void onBackPressed() { if (getSupportFragmentManager().findFragmentByTag("fragBack") != null) { } else { super.onBackPressed(); return; } if (getSupportFragmentManager().getBackStackEntryCount() != 0) { Toast.makeText(getApplicationContext(), "Test", Toast.LENGTH_LONG).show(); Fragment frag = getSupportFragmentManager().findFragmentByTag("fragBack"); FragmentTransaction transac = getSupportFragmentManager().beginTransaction().remove(frag); transac.commit(); } }
¿Alguien sabe lo que tengo que hacer? ¿Necesito llamar a la función BackPressed en cada fragmento (si es posible) en lugar de la FragmentActivity que controla el cajón? En mis aplicaciones pasadas he estado bien con el botón de atrás cerrando la aplicación sin importar de qué fragmento esté el usuario pero el que estoy haciendo ahora quiero que el botón de regreso vuelva a Fragment1.
Realmente apreciaría alguna ayuda, gracias.
OnItemClick
@Override public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { Fragment newFragment = new MapsPage(); FragmentManager fm = getSupportFragmentManager(); switch(i) { case 0: newFragment = new Fragment2(); break; case 1: newFragment = new Fragment3(); break; case 2: newFragment = new Fragment4(); break; case 3: newFragment = new Fragment5(); break; } fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragback").commit(); drawerLayout.closeDrawer(rl); }
- Hacer clic en icono de hamburguesa en la barra de herramientas no abre Cajón de navegación
- ¿Cómo agregar un título en el diseño del cajón de navegación?
- Adición de una imagen grande a un cajón de navegación (SlidingMenu libs) - ¿Cómo?
- Android: Fragmento de preferencia con un fragmento de cajón de navegación
- SeekBar en un NavigationDrawer
- Cómo hacer navegación personalizada ver animaciones como ésta
- Cajón de navegación Animación android
- Cambiar los elementos del cajón de navegación dentro del fragmento
En lugar de:
fm.beginTransaction().replace(R.id.main, newFragment).addToBackStack("fragBack").commit();
Llamada:
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();
AddToBackStack funciona con add
.
replace
función elimina el fragmento anterior y coloca el nuevo fragmento de modo que en su back-stack hay sólo un fragmento todo el tiempo. Así que use añadir función para mantener los fragmentos anteriores en la pila.
Para siempre goto fragemnt1 de cualquier fragmento de onBackPress tratar de hacer lo siguiente:
getFragmentManager().popBackStack(); fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();
Esto quitará la última transacción de backstack y agregará uno nuevo. Prueba esto.
Sólo quería informar de mis descubrimientos, aunque esta pregunta es un poco antigua para cualquier otra persona que puede haber tenido el mismo problema con la respuesta aceptada. Para mí, haciendo el método sugerido en la respuesta aceptada, hizo que las capas se superponen, haciéndolos rápidamente ilegibles. El código de abajo (adaptado de la respuesta aceptada) evita la superposición pero todavía agrega la pantalla a la pila trasera.
fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack("fragBack").commit();
Espero que esto ayude a alguien!
En algunos casos usted tiene que utilizar el reemplazo entonces usted no puede trabajar con addtobackstack () así que usted puede utilizar este código en mainActivity. En este código cuando presionas la tecla hacia atrás siempre vas al primer fragmento (lo llamo HomeFragment) y cuando estás en Home Fragment pide dos veces para salir de la aplicación (lo siento por mi inglés pobre)
private Boolean exit = false; @Override public void onBackPressed() { if (exit) { super.onBackPressed(); return; } try { FragmentManager fragmentManager = getSupportFragmentManager(); Fragment fragment = fragmentManager.findFragmentByTag("HOME"); if (fragment != null) { if (fragment.isVisible()) { this.exit = true; Toast.makeText(this, "Press Back again to Exit", Toast.LENGTH_SHORT).show(); } } else { fragment = HomeFragment.class.newInstance(); getFragmentManager().popBackStack(); fragmentManager.beginTransaction().replace(R.id.flContent, fragment, "HOME").commit(); } } catch (Exception e) { } new Handler().postDelayed(new Runnable() { @Override public void run() { exit = false; } }, 2000); }
Yo sugeriría evitar una anulación de onBackPressed()
por completo por la gestión de sus transacciones correctamente en el primer lugar. Esto ayudará a evitar tener que implementar la lógica loca en el camino.
Para hacer esto primero necesitamos establecer una variable de clase privada en la que se habilitará la inicialización:
private boolean popNext = false;
El siguiente código nos permite configurar la función de retroceso inicial colocándola en la pila. Cada vez a partir de entonces, cuando popNext
se establece en true, popNext
la transacción inicial y empujamos la nueva. Así que estamos reemplazando la transacción 1> X por la transacción 1> Y.
Las instrucciones extra embedded if
tratan de seleccionar el elemento inicial, ya que no queremos pasar de 1> 1 . Si es nuestro caso inicial, cerramos el cajón. El otro caso tiene que actuar como el botón de retroceso, pero tenemos que recordar para configurarlo como si estuviera regresando al estado inicial.
if(popNext){ if(i == INITIAL_POSITION){ onBackPressed(); mDrawerLayout.closeDrawer(mDrawerList); popNext = false; return; } getFragmentManager().popBackStackImmediate(); } else{ if(i == INITIAL_POSITION){ mDrawerLayout.closeDrawer(mDrawerList); return; } popNext=true; } getFragmentManager() .beginTransaction() .replace(R.id.fragment_container, fragment) .addToBackStack(null) .commit();
Nota: Mi código utiliza getFragmentManager()
lugar de getSupportFragmentManager()
que es una función nativa, creo que a partir de Honeycomb.