android - varios - ¿Cómo reemplazar el fragmento C con el fragmento A cuando se presiona el botón Atrás?
varios fragments android (3)
Mi escenario: la Actividad 1 consiste en Fragmentos A-> B-> C. Todos los fragmentos se agregan usando este código:
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.content, fragment, TAG);
ft.addToBackStack(TAG);
ft.commit();
Ahora, desde el fragmento C, quiero regresar directamente al Fragmento A. Por lo tanto, he comentado ft.addToBackStack(TAG)
al agregar el Fragmento C. De modo que cuando ft.addToBackStack(TAG)
botón Atrás desde CI, obtengo el Fragmento A directamente en la pantalla.
Sin embargo, el Fragmento C no es reemplazado por A. De hecho, ambos fragmentos son visibles. ¿Cómo resuelvo este problema?
Necesita hacer dos cosas: nombrar FragmentTransaction de A-> B y luego anular onBackPressed () en su actividad de contenido para llamar a FragmentManager # popBackStack (String name, int flags) cuando se encuentre en el Fragmento C. Ejemplo:
Transición de A-> B
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, new FragmentB(), "FragmentB")
.addToBackStack("A_B_TAG")
.commit();
La transición desde B-> C usará una transacción similar con "FragmentC" como su etiqueta.
Luego, en su anulación de actividad que contiene onBackPressed ():
@Override
public void onBackPressed() {
if (getSupportFragmentManager().findFragmentByTag("FragmentC") != null) {
// I''m viewing Fragment C
getSupportFragmentManager().popBackStack("A_B_TAG",
FragmentManager.POP_BACK_STACK_INCLUSIVE);
} else {
super.onBackPressed();
}
}
Teoría
Utilice el addToBackStack(tag:String):FragmentTransaction
dentro de FragmentTransaction
para marcar el punto al que desea regresar. Este método devuelve la instancia de FragmentTransaction
para la habilidad de cadena.
A continuación, regrese con el popBackStackImmediate(tag:String,flag:int):void
del FragmentManager
. La etiqueta es lo que especificó antes. El indicador es la constante POP_BACK_STACK_INCLUSIVE
para incluir la transacción marcada o 0
.
Ejemplo
Lo que sigue es un ejemplo con el siguiente diseño que tiene un FrameLayout
con id content_frame
donde se cargan los fragmentos.
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
<FrameLayout
android:id="@+id/content_frame"
android:layout_below="@id/textView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
El código siguiente marca un fragmento por su nombre de clase de fragmento al reemplazar el contenido del elemento de diseño con id content_frame
.
public void loadFragment(final Fragment fragment) {
// create a transaction for transition here
final FragmentTransaction transaction = getSupportFragmentManager()
.beginTransaction();
// put the fragment in place
transaction.replace(R.id.content_frame, fragment);
// this is the part that will cause a fragment to be added to backstack,
// this way we can return to it at any time using this tag
transaction.addToBackStack(fragment.getClass().getName());
transaction.commit();
}
Y para completar este ejemplo, un método que le permite volver a ese mismo fragmento exacto usando la etiqueta cuando lo cargó.
public void backToFragment(final Fragment fragment) {
// go back to something that was added to the backstack
getSupportFragmentManager().popBackStackImmediate(
fragment.getClass().getName(), 0);
// use 0 or the below constant as flag parameter
// FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
Al implementar esto de manera real, es posible que desee agregar una verificación nula en el parámetro de fragmento ;-).
Button apply=(Button)view.findViewById(R.id.apply);
apply.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
FragmentManager fm=activity.getSupportFragmentManager();
Fragment f = new QuickRegistration();
FragmentTransaction ft= fm.beginTransaction();
ft.addToBackStack(null);
ft.replace(R.id.mainframe,f);
ft.commit();
}
});
usar importaciones
import android.support.v4.app.FragmentManager;
import android.content.Context;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentTransaction;
import android.support.v4.app.FragmentActivity;