¿Cómo obtener un Fragmento para eliminar a sí mismo, es decir, su equivalente de finish ()?

Estoy convirtiendo una aplicación para usar fragmentos usando la biblioteca de compatibilidad. Ahora en la actualidad tengo una serie de actividades (ABCD) que se encadenan entre sí, D tiene un botón 'OK' que al pulsar las llamadas terminan que luego burbujas a través de onActivityResult para destruir adicionalmente C y B.

Para mi versión de fragmento pre Honycomb cada actividad es efectivamente una envoltura en fragmentos Af Bf Cf Df. Todas las actividades se lanzan a través de startActivityForResult y onActivityResult dentro de cada uno de los fragmentos pueden llamar felizmente a getActivity (). Finish

El problema que estoy teniendo aunque está en mi versión Honeycomb sólo tengo una actividad, A, y los fragmentos Bf, Cf, Df se cargan con el FragmentManager.

Lo que no entiendo es qué hacer en Df cuando se pulsa 'OK' para quitar los fragmentos Df, Cf y Bf?

Intenté tener el fragmento que hace estallar fuera de la pila pero esto dio lugar a una excepción. OnActivityResult es inútil porque no he cargado el fragmento usando startActivityForResult.

¿Estoy pensando en esto completamente por el camino equivocado? ¿Debo implementar algún tipo de oyente que se comunica con el fragmento padre o la actividad con el fin de hacer el pop utilizando el gestor de transacciones?

Lo que no entiendo es qué hacer en Df cuando se pulsa 'OK' para quitar los fragmentos Df, Cf y Bf?

Paso # 1: Df decir D "yo! Tenemos el clic OK!" Mediante la llamada de un método, ya sea en la propia actividad o en una instancia de interfaz suministrada por la actividad.

Paso # 2: Haga que D quite los fragmentos vía FragmentManager .

La actividad de acogida (D) es la que sabe qué otros fragmentos están en la actividad (frente a estar en otras actividades). Por lo tanto, los eventos en fragmentos que podrían afectar la mezcla de fragmentos deben propagarse a la actividad, lo que hará que los movimientos de orquestación apropiados.

Si bien puede no ser el mejor enfoque el equivalente más cercano que puedo pensar que funciona es esto con la biblioteca de compatibilidad / compatibilidad

 getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); 

o

 getActivity().getFragmentManager().beginTransaction().remove(this).commit(); 

de otra manera.

Además, puede utilizar el backstack y pop. Sin embargo, tenga en cuenta que el fragmento podría no estar en la backstack (dependiendo de la fragmenttransaction que lo consiguió allí ..) o puede que no sea el último que se puso en la pila para que la pila podría quitar la equivocada …

Puede utilizar el enfoque siguiente, funciona bien:

 getActivity().getSupportFragmentManager().popBackStack(); 

Debe dejar que la Actividad se ocupe de agregar y eliminar Fragmentos, como dice CommonsWare, usar un oyente. Aquí hay un ejemplo:

 public class MyActivity extends FragmentActivity implements SuicidalFragmentListener { // onCreate etc @Override public void onFragmentSuicide(String tag) { // Check tag if you do this with more than one fragmen, then: getSupportFragmentManager().popBackStack(); } } public interface SuicidalFragmentListener { void onFragmentSuicide(String tag); } public class MyFragment extends Fragment { // onCreateView etc @Override public void onAttach(Activity activity) { super.onAttach(activity); try { suicideListener = (SuicidalFragmentListener) activity; } catch (ClassCastException e) { throw new RuntimeException(getActivity().getClass().getSimpleName() + " must implement the suicide listener to use this fragment", e); } } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); // Attach the close listener to whatever action on the fragment you want addSuicideTouchListener(); } private void addSuicideTouchListener() { getView().setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { suicideListener.onFragmentSuicide(getTag()); } }); } } 

En la actividad / AppCompatActivity:

 @Override public void onBackPressed() { if (mDrawerLayout.isDrawerOpen(GravityCompat.START)) { // if you want to handle DrawerLayout mDrawerLayout.closeDrawer(GravityCompat.START); } else { if (getFragmentManager().getBackStackEntryCount() == 0) { super.onBackPressed(); } else { getFragmentManager().popBackStack(); } } } 

Y luego llamar en el fragmento:

 getActivity().onBackPressed(); 

O como se indica en otras respuestas, lo llamamos en el fragmento:

 getActivity().getSupportFragmentManager().beginTransaction().remove(this).commit(); 

Vea si sus necesidades son satisfechas por un DialogFragment. DialogFragment tiene un método dismiss (). Mucho más limpio en mi opinión.

Creo un método simple para eso

 popBackStack(getSupportFragmentManager()); 

Que colocarlo en mi clase de ActivityUtils

 public static void popBackStack(FragmentManager manager){ FragmentManager.BackStackEntry first = manager.getBackStackEntryAt(0); manager.popBackStack(first.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE); } 

Es un gran trabajo, diviértete!

Si necesita popback desde el cuarto fragmento en la historia backstack a la primera, use etiquetas !!!

Cuando añadas el primer fragmento debes usar algo como esto:

GetFragmentManager.beginTransaction. AddToBackStack ("A") .add (R.id.container, FragmentA) .commit ()

o

GetFragmentManager.beginTransaction. AddToBackStack ("A") .replace (R.id.container, FragmentA) .commit ()

Y cuando quiera mostrar Fragmentos B, C y D, utilice esto:

GetFragmentManager.beginTransaction. AddToBackStack ("B") .replace (R.id.container, FragmentB, "B"). Commit ()

Y otras letras ….

Para volver al Fragmento A, solo tienes que llamar a popBackStack (0, "A") , sí, usa el indicador que especificaste cuando lo agregas y observa que debe ser el mismo flag en el comando addToBackStack , no el que se utiliza en el comando Reemplazar o agregar.

De nada 😉

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.