Ninguna de las otras preguntas que he leído en stackoverflow han sido capaces de ayudar con mi problema. Como lo que yo puedo decir, yo estoy haciendo todo correctamente.

Tengo un maestro/detalle de flujo con fragmentos.

A partir de la creación de la actividad principal, el maestro fragmento es cargado con el siguiente código:

    Fragment frag;
    frag = new MainListFragment();//<-- **the master fragment**

    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    transaction.replace(R.id.fragment_container, frag);
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());
    transaction.commit();

El maestro fragmento tiene un ListView; al hacer clic en un elemento de la lista trae los detalles fragmento como el siguiente:

@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
    super.onListItemClick(listView, view, position, id);


    FragmentManager fm = getFragmentManager();
    FragmentTransaction transaction = fm.beginTransaction();
    SubListFragment frag = new SubListFragment();//<-- **the detail fragment**

    transaction.replace(R.id.fragment_container, frag);
    transaction.addToBackStack(null);
    transaction.commit();
    fm.executePendingTransactions();
    Log.d("My Debug Bitches", "stack:" + fm.getBackStackEntryCount());

}

Ahora, de acuerdo a LogCat, el BackStackEntryCount cambia de 0 a 1 después de que me vaya de maestro fragmento de detalle fragmento: De vuelta el botón de cierre de la aplicación, incluso cuando el uso de FragmentTransaction.addToBackStack()

Así que ¿por qué es que, cuando hago clic en el botón atrás, mientras que en los detalles fragmento, que la app se cierra en lugar de regresar a la maestra fragmento??????????

OriginalEl autor scottyseus | 2014-05-19

2 Comentarios

  1. 57

    Tiene que agregar el popBackStack() llamada a la onBackPressed() método de la actividad.

    Ex:

    @Override
    public void onBackPressed() {
        if (fragmentManager.getBackStackEntryCount() > 0) {
            fragmentManager.popBackStack();
        } else {
            super.onBackPressed();
        }
    }
    Apareciendo un Fragment ES una acción especial. El botón ATRÁS estaba ahí mucho antes de Fragments y cambiando su comportamiento por defecto en el núcleo de Android de código no habría sido una buena idea por razones de compatibilidad con versiones anteriores. De ahí la razón por la que usted necesita para manejar las cosas a sí mismo.
    Aceptar que tiene sentido. Soy un newb así que fácilmente pasar por alto estos detalles. Gracias por la ayuda.
    La documentación dice lo contrario! «Pop fragmentos de la parte posterior de la pila, con popBackStack() (simulando un comando Atrás por el usuario).» developer.android.com/guide/components/fragments.html Bastante desconcertante. No menciona onBackPressed(). Gracias por tu solución. Yo estaba buscando una manera automática porque se siente como un hack.
    Ni siquiera se menciona en la documentación que específicamente sobre la espalda de navegación con fragmentos. De hecho parece que a estado algo que de plano falso: «Cuando hay FragmentTransaction objetos en la parte posterior de la pila y el usuario presiona el botón Atrás, el FragmentManager aparece la transacción más reciente de la parte posterior de la pila y se realiza la acción inversa.» Gracias A Google. Y no sarcástico gracias a Bobbake4. developer.android.com/training/implementing-navigation/…
    Me di cuenta recientemente de que este es el caso de las versiones más recientes de Android. En la biblioteca de compatibilidad de versión debe agregar el popbackstack código, pero al menos en Kit Kat el comportamiento predeterminado es pop la parte posterior de la pila.

    OriginalEl autor Bobbake4

  2. 0

    @Bobbake4 la respuesta es impresionante, pero hay un pequeño problema.
    Digamos que tengo tres fragmentos de a, B y C.
    Una es el principal Fragmento (el fragmento que se muestra cuando ejecuto mi aplicación), B y C son fragmentos puedo navegar desde el cajón de navegación o de A.
    Ahora, cuando tengo que utilizar el botón atrás de B o C, vuelvo a la anterior fragmento (Un) bien, pero el título del fragmento anterior (fragmento B o C) se muestra ahora en la actionBar título del Fragmento A. tengo que pulsar el botón volver de nuevo a la «verdad» completa la parte de atrás de navegación (para mostrar la vista y corregir el título para el fragmento y volviendo a)

    Esto es cómo he resuelto este problema. Declarar estas variables.

     public static boolean IS_FRAG_A_SHOWN = false;
     public static boolean IS_FRAG_B_SHOWN = false;
     public static boolean IS_FRAG_C_SHOWN = false;

    En el MainActivity de mi aplicación, donde soy el manejo de la navegación cajón de métodos, tengo un método displayView(position) que se encarga de la conmutación de mis fragmentos.

    private void displayView(int position) {
        IS_FRAG_A_SHOWN = false;
        IS_FRAG_B_SHOWN = false;
        IS_FRAG_C_SHOWN = false;
        //update the main content by replacing fragments
        Fragment fragment = null;
        switch (position) {
            case 0:
                fragment = new FragmentA();
                IS_FRAG_A_SHOWN = true;
                break;
            case 1:
                fragment = new FragmentB();
                IS_FRAG_B_SHOWN = true;
                break;
            case 2:
                fragment = new FragmentC();
                IS_FRAG_C_SHOWN = true;
                break;
    
            default:
                break;
        }

    finalmente, en mi onBackPressed método, yo hago esto:

    public void onBackPressed() {
        if(fragmentManager.getBackStackEntryCount() != 0) {
            fragmentManager.popBackStack();
            if (IS_FRAG_A_SHOWN) { //If we are in fragment A when we press the back button, finish is called to exit
                finish();
            } else  {
                displayView(0); //else, switch to fragment A
            }
    
        } else {
            super.onBackPressed();
        }
    }

    OriginalEl autor ojonugwa ochalifu

Dejar respuesta

Please enter your comment!
Please enter your name here