volver varios tecla studio regresar pasar parametros iniciar fragments entre diferencia boton anterior activity android android-fragments back-stack fragmenttransaction

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;