Как заменить фрагмент C на фрагмент A при нажатии кнопки «Назад»?

Мой сценарий: Действие 1 состоит из фрагментов A-> B-> C. Все фрагменты добавляются с использованием этого кода:

FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.replace(R.id.content, fragment, TAG); ft.addToBackStack(TAG); ft.commit(); 

Теперь, из фрагмента C, я хочу прямо вернуться к фрагменту A. Поэтому я комментировал ft.addToBackStack(TAG) , добавляя Fragment C. Поэтому, когда я ft.addToBackStack(TAG) кнопку CI, непосредственно получаю фрагмент A на экране.

Тем не менее, фрагмент C не заменяется A. Фактически оба фрагмента видны. Как решить эту проблему?

Solutions Collecting From Web of "Как заменить фрагмент C на фрагмент A при нажатии кнопки «Назад»?"

теория

Используйте метод addToBackStack(tag:String):FragmentTransaction изнутри FragmentTransaction , чтобы отметить точку, в которую вы хотите вернуться. Этот метод возвращает экземпляр FragmentTransaction для возможности цепочки.

Затем возвращаем с помощью popBackStackImmediate(tag:String,flag:int):void метод из FragmentManager . Тег – это то, что вы указали ранее. Флаг является константой POP_BACK_STACK_INCLUSIVE чтобы включить транзакцию с отметкой или 0 .

пример

Далее следует пример со следующим макетом, имеющим FrameLayout с id content_frame в который загружаются фрагменты.

 <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> 

Приведенный ниже код помечает фрагмент его именем класса фрагмента при замене содержимого элемента layout 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(); } 

И для завершения этого примера рассмотрим метод, позволяющий вам вернуться к тому же самому фрагменту с помощью тега при его загрузке.

 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); } 

При реализации этого для реального вам может потребоваться добавить нулевую проверку параметра фрагмента ;-).

Вам нужно сделать 2 вещи – назовите FragmentTransaction из A-> B, а затем переопределите onBackPressed () в своей активной деятельности, чтобы вызвать FragmentManager # popBackStack (имя строки, int flags), когда вы находитесь на фрагменте C. Пример:

Переход от A-> B

 getSupportFragmentManager() .beginTransaction() .replace(R.id.container, new FragmentB(), "FragmentB") .addToBackStack("A_B_TAG") .commit(); 

Переход от B-> C будет использовать аналогичную транзакцию с «FragmentC» в качестве ее тега.

Затем в вашем активном переопределении функции 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(); } } 
  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(); } }); 

Использовать импорт

 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;