¿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.

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); } 

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.

  • Nuevo ícono oficial para Android Navigation Drawer
  • Cómo crear un subnivel en el menú de navegación en android?
  • ¿En qué componentes de interfaz de usuario deben utilizarse los filtros y / o la clasificación?
  • Reemplazar el diseño de la barra de herramientas de acuerdo con el fragmento visualizado
  • Cambiar el título del encabezado de NavigationView
  • Android - Cómo cambiar fragmentos en el cajón de navegación
  • ¿Cómo superar este elemento de relleno en el cajón de navegación?
  • Elementos de menú de la bandeja de navegación seleccionados dentro de diferentes grupos
  • Pestañas de la barra de acción con ViewPager con el cajón de navegación
  • No se puede agregar pestañas dentro de Fragmento de cajón de navegación Android
  • Android: ¿Es mejor crear un nuevo fragmento cada vez que se hace clic en un elemento del cajón de navegación o cargar fragmentos creados anteriormente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.