android - regresar - Cajón de navegación, manejando el botón Atrás para ir a los fragmentos anteriores?
programar boton atras android (5)
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 de replace
elimina el fragmento anterior y coloca un nuevo fragmento, por lo que en su pila de respaldo solo hay un fragmento todo el tiempo. Así que use la función de agregar para mantener los fragmentos anteriores en la pila.
Para obtener siempre fragemnt1 de cualquier fragmento enBackPress intente hacer lo siguiente:
getFragmentManager().popBackStack();
fm.beginTransaction().add(R.id.main, newFragment).addToBackStack("fragBack").commit();
esto eliminará la última transacción de backstack y agregará una nueva. Prueba esto.
Estoy usando el cajón de navegación integrado para ejecutar mi aplicación. No puedo entender cómo manejar el botón Atrás. Cuando se presiona, quiero que cargue el primer fragmento de nuevo. Fragmento1.
Entonces, cuando se inicia la aplicación, ve Fragment1 lanzado. Luego pueden hacer clic en el Fragmento 2-5 para ir a otras páginas. En todas estas páginas, quiero que el botón Atrás lleve al usuario a Fragment1. El único lugar donde el usuario debería poder salir de la aplicación mediante el botón Atrás es Fragmento1.
Como todo está manejado por FragmentActivity intenté jugar con el botón de respaldo allí. Sigo recibiendo un error de cierre de 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 posterior de esta manera:
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? ¿Debo llamar aBackPressed en cada fragmento (si es posible) en lugar de FragmentActivity que controla el cajón? En mis aplicaciones anteriores, he estado bien con el botón Atrás cerrando la aplicación, independientemente del Fragmento en el que esté el usuario, pero el que estoy haciendo ahora, quiero que el botón Atrás regrese a Fragmento1.
Realmente agradecería algo de 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);
}
Solo quería informar mis hallazgos a pesar de que esta pregunta es un poco antigua para cualquier otra persona que pueda haber tenido el mismo problema con la respuesta aceptada. Para mí, hacer el método sugerido en la respuesta aceptada, hizo que las capas se superpongan, convirtiéndolas rápidamente en ilegibles. El código siguiente (adaptado de la respuesta aceptada) evita la superposición, pero aún agrega la pantalla a la pila posterior.
fragmentManager.beginTransaction().replace(R.id.container, fragment).addToBackStack("fragBack").commit();
¡Espero que esto ayude a alguien!
Sugiero evitar una anulación de onBackPressed()
por completo administrando sus transacciones correctamente en primer lugar. Esto ayudará a evitar tener que implementar una lógica loca en el futuro.
Para hacer esto primero necesitamos establecer una variable de clase privada que permita la inicialización:
private boolean popNext = false;
El siguiente código nos permite configurar la función de respaldo inicial colocándolo en la pila. Cada vez que después, cuando popNext
se establece en verdadero, mostramos la transacción inicial y presionamos la nueva. Entonces estamos reemplazando la transacción 1> X con la transacción 1> Y.
Las sentencias if
adicionales incrustadas se ocupan de seleccionar el elemento inicial, ya que no queremos pasar de 1> 1 . Si es nuestro caso inicial, simplemente cerramos el cajón. El otro caso necesita actuar como el botón Atrás, pero debemos recordar configurarlo como si volviera 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 usa getFragmentManager()
lugar de getSupportFragmentManager()
que es una función nativa, creo que a partir de Honeycomb.
en algunos casos, debe reemplazar, entonces no puede trabajar con addtobackstack () para que pueda usar este código en mainActivity. en este código, cuando presiona la tecla Atrás, siempre va al primer Fragmento (lo llamo HomeFragment) y cuando está en Home Fragment, pida dos veces que salga de la aplicación (lo siento por mi pobre inglés)
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);
}
- @Override
public void onBackPressed() {
DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
int backstack = getSupportFragmentManager().getBackStackEntryCount();
if (drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else if (backstack > 0) {
for (int i = 0; i < backstack; i++) {
getSupportFragmentManager().popBackStackImmediate();
}
} else {
this.finish();
}
}