transaction studio fragments example begintransaction begin android android-fragments android-nested-fragment

studio - fragmentmanager example in android



Fragmentos anidados y The Back Stack (3)

Tengo el mismo problema, me gustaría anidar fragmentos y mantener una pila de respaldo para cada fragmento anidado.

Pero ... parece que este caso no es manejado por la biblioteca de soporte v4. En el código de FragmentActivity en la biblioteca, puedo encontrar:

public void onBackPressed() { if (!mFragments.popBackStackImmediate()) { finish(); } }

El mFragments representa el FragmentManager de la actividad, pero no parece que este administrador "propague" el pop a los administradores de niños. Una solución alternativa sería llamar manualmente a popBackStackImmediate () en el administrador hijo, como este en la actividad heredada de FragmentActivity:

private Fragment myFragmentContainer; @Override public void onBackPressed() { if (!myFragmentContainer.getChildFragmentManager().popBackStackImmediate()) { finish(); //or call the popBackStack on the container if necessary } }

Puede haber una mejor manera, y una forma más automatizada, pero para mis necesidades está bien.

¿Back Stack admite la interacción con Fragments anidados en Android?

Si lo hace, ¿qué estoy haciendo mal? En mi implementación, el botón Atrás está ignorando por completo el hecho de que agregué esta transacción a la pila de respaldo. Espero que no sea por un problema con los fragmentos anidados y solo que yo haga algo incorrectamente.

El siguiente código está dentro de uno de mis fragmentos y se usa para intercambiar un nuevo fragmento con el fragmento anidado que se muestra actualmente:

MyFragment fragment = new MyFragment(); FragmentTransaction ft = getChildFragmentManager().beginTransaction(); ft.setCustomAnimations(R.animator.slide_in_from_right, R.animator.slide_out_left, R.animator.slide_in_from_left, R.animator.slide_out_right); ft.addToBackStack(null); ft.replace(R.id.myFragmentHolder, fragment); ft.commit();


@Override public void onBackPressed() { FragmentManager fm = getSupportFragmentManager(); if (fm.getBackStackEntryCount() > 0) { fm.popBackStack(); return; } finish(); }


En mi proyecto actual, tenemos varias "capas anidadas", así que he encontrado la siguiente solución para mostrar automáticamente el backstack solo para los administradores de fragmentos de nivel superior:

@Override public void onBackPressed() { SparseArray<FragmentManager> managers = new SparseArray<>(); traverseManagers(getSupportFragmentManager(), managers, 0); if (managers.size() > 0) { managers.valueAt(managers.size() - 1).popBackStackImmediate(); } else { super.onBackPressed(); } } private void traverseManagers(FragmentManager manager, SparseArray<FragmentManager> managers, int intent) { if (manager.getBackStackEntryCount() > 0) { managers.put(intent, manager); } if (manager.getFragments() == null) { return; } for (Fragment fragment : manager.getFragments()) { if (fragment != null) traverseManagers(fragment.getChildFragmentManager(), managers, intent + 1); } }