android - from - Fragmento PopBackStack
delete fragment from backstack (3)
Estoy teniendo un problema extraño, mientras uso Fragmentos y los recupero.
Tengo una actividad de fragmento:
Paso 1: estoy adjuntando un Fragmento en el onCreate de esa Actividad en el Fragmento A que comienza como:
Esta es la actividad onCreate of Fragment
@Override
protected void onCreate(Bundle savedBundleState) {
super.onCreate(savedBundleState);
setContentView(R.layout.activity_base_new);
Fragement_Home home = new Fragement_Home();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
}
Paso: 2 Luego adjunté el Fragmento con el siguiente código:
Fragment_More moreFragment = new Fragment_More();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().replace(R.id.frameContent, moreFragment).addToBackStack("more").commit();
Paso 3: Después de eso otra vez, agregué un fragmento más en Fragment_More de la misma manera:
Fragment_AboutRockstand termsConditions = new Fragment_AboutRockstand();
getActivity().getSupportFragmentManager().beginTransaction().replace(R.id.frameContent, termsConditions).addToBackStack("about_rockstand").commit();
y aquí está la actividad de mi Fragmento enBackPressedButton Lisetener:
@Override
public void onBackPressed() {
FragmentManager fm = getSupportFragmentManager();
Fragment f = fm.findFragmentById(R.id.frameContent);
if(fm.getBackStackEntryCount() > 1){
fm.popBackStack();
} else{
finish();
}
}
Aquí está el problema que estoy obteniendo:
Cuando vuelvo a presionar desde el Paso 3, me da el fragmento anterior con éxito, tal como lo describe onBackPressed, se abrirá de nuevo y me llevará al Fragmento anterior. Pero desde Fragment_More, cuando presiono de nuevo, me muestra contenido de FRAGMENTO en blanco. Nunca muestra el Primer Fragmento que agregué en el Paso 1 en OnCreate of the Activity.
Por favor comenta. Que estoy haciendo mal ?
Gracias
No debe agregar su primer fragmento al backstack, ya que al presionar la tecla de retorno solo se invertirá la acción que realizó. Entonces, si reemplazas un fragmento y presionas hacia atrás, revertirá el reemplazo que hiciste. Pero si presiona de nuevo en una .add()
fragmento '' .add()
'', simplemente la eliminará y le mostrará una página en blanco. Así que creo que eliminar el primer fragmento del backstack debería hacer el truco. ¡Inténtalo y me cuentas!
@Override
protected void onCreate(Bundle savedBundleState) {
super.onCreate(savedBundleState);
setContentView(R.layout.activity_base_new);
Fragement_Home home = new Fragement_Home();
FragmentManager manager = getSupportFragmentManager();
manager.beginTransaction().add(R.id.frameContent, home).commit();
}
EJEMPLO:
Así que digamos que tienes dos fragmentos llamados A y B
Si .add()
fragmento A a la página, y " addToBackStack()
" (= guardar el reverso de la acción), habrá guardado el QUITAR fragmento A como acción cuando haga clic en atrás.
Si .replace()
fragmento A por el fragmento B y también " addToBackStack()
", habrá guardado la eliminación B y la adición A como acción cuando haga clic en Atrás.
Entonces, ¿ven por qué no es una buena práctica agregar su primera transferencia de fragmentos al backstack? Simplemente dará como resultado la eliminación del fragmento A al presionar hacia atrás, lo que resultará en una página en blanco. Espero que esto sea suficiente información.
Además, una vez que haya eliminado addToBackStack()
de su primer fragmento, no necesita anular onBackPressed()
porque funcionará de la manera que se supone. Simplemente terminará la actividad cuando no quede nada en el backstack sin mostrarle esa página en blanco primero.
Tu linea:
if(fm.getBackStackEntryCount() > 1){
debiera ser:
if (fm.getBackStackEntryCount() > 0) {
Estás poniendo 3 fragmentos en el backstack. Después de quitar las dos primeras entradas, el recuento de entradas en el backstack equivale a 1. Por lo tanto, se evita recuperar el primer fragmento que agregó al backstack.
está utilizando este manager.beginTransaction().add(R.id.frameContent, home).addToBackStack("home").commit();
intente usar esto en su lugar manager.beginTransaction().replace(R.id.frameContent, home).addToBackStack("home").commit();
Déjame saber si funciona para ti