Подтвердить что ты не робот

Как заменить фрагмент 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. Поэтому, когда я нажимаю кнопку CI, непосредственно получаю фрагмент A на экране.

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

4b9b3361

Ответ 1

Теория

Используйте 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>

Приведенный ниже код маркирует фрагмент с помощью этого имени класса фрагмента при замене содержимого элемента макета 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

Вам нужно сделать 2 вещи - назовите FragmentTransaction из A- > B, а затем переопределите onBackPressed() в своей деятельности, чтобы вызвать FragmentManager # popBackStack (String name, 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();
  }
}

Ответ 3

  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;