Как я могу использовать стек транзакций для извлечения фрагментов?

Предположим, у меня есть MainActivity с FragmentContainerView. Размер этого FragmentContainerView соответствует размеру MainActivity.

Затем я хочу показывать по одному фрагменту в этом FragmentContainerView.

Фрагмент1, Фрагмент2 и Фрагмент3.

На каждом фрагменте будет по одной кнопке. При нажатии кнопки загружается следующий фрагмент.

Fragment1 (нажать кнопку) - ›Fragment2 (нажать кнопку) -› Fragment3 (нажать кнопку) - ›Fragment1 -› и так далее.

Пока мне удалось реализовать, но я не уверен, как сделать мои фрагменты такими, чтобы, когда я нажимаю кнопку возврата,

Fragment1 должен выйти из приложения

Fragment2 должен загрузить Fragment1

Fragment3 должен загрузить Fragment2

Вот моя MainActivity

    public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        FirstFragment fragment = new FirstFragment();
        Bundle bundle = new Bundle();
        bundle.putString("CLASS_NAME", " ");
        fragment.setArguments(bundle);
        getSupportFragmentManager().beginTransaction()
                .add(R.id.fragment_container_view, fragment, null)
                .commit();
    }
}

Вот мой Fragment1

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

       
        binding = FragmentFirstBinding.bind(getView());


        String previous_class = getArguments().getString("CLASS_NAME");
        if(!previous_class.equals(" ")){
            binding.textViewFirstFragment.setText(previous_class);
        }

        //On button click, navigate to MainActivity
        binding.buttonFirstFragment.setOnClickListener(this);
    }

@Override
    public void onClick(View v) {
        //Log.i("BACKSTACK", "debug: current status of fragment back stack " + getFragmentManager().getBackStackEntryCount());
        Fragment fragment = new SecondFragment();
        putBundleArgument(fragment);
        replaceFragment(fragment);
        debug();
    }

    public void replaceFragment(Fragment fragment) {
        FragmentTransaction transaction = getFragmentManager().beginTransaction();
        transaction.replace(R.id.fragment_container_view, fragment);
        transaction.addToBackStack(null);
        transaction.commit();
    }

Вот мой Фрагмент2

@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

   
    binding = FragmentSecondBinding.bind(getView());

    String previous_class = getArguments().getString("CLASS_NAME");
    binding.textViewSecondFragment.setText(previous_class);
    //On button click, navigate to MainActivity
    binding.buttonSecondFragment.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    //Log.i("BACKSTACK", "debug: current status of fragment back stack " + getFragmentManager().getBackStackEntryCount());
    Fragment fragment = new ThirdFragment();
    putBundleArgument(fragment);
    replaceFragment(fragment);
    debug();
}

public void replaceFragment(Fragment fragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container_view, fragment);
    transaction.addToBackStack(null);
    transaction.commit();
}

Наконец, вот мой Fragment3

 @Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    
    binding = FragmentThirdBinding.bind(getView());

    String previous_class = getArguments().getString("CLASS_NAME");
    binding.textViewThirdFragment.setText(previous_class);
    //On button click, navigate to MainActivity
    binding.buttonThirdFragment.setOnClickListener(this);
}

@Override
public void onClick(View v) {

    Fragment fragment = new FirstFragment();
    putBundleArgument(fragment);
    replaceFragment(fragment);
    debug();

}
public void replaceFragment(Fragment fragment) {
    FragmentTransaction transaction = getFragmentManager().beginTransaction();

    /*
    ThirdFragment fragment3 = new ThirdFragment();
    transaction.remove(fragment3);
    SecondFragment fragment2 = new SecondFragment();
    transaction.remove(fragment2);
    */
    getFragmentManager().popBackStack();
    getFragmentManager().popBackStack();
    getFragmentManager().popBackStack();


    transaction.replace(R.id.fragment_container_view, fragment);
    transaction.addToBackStack(null);
    transaction.commit();

}

person jungrylls    schedule 28.05.2021    source источник
comment
Итак, какой шаг в вашем коде идет не так? Это когда ты впервые на FragmentOne? После перехода к FragmentTwo и попытки вернуться к One? После перехода к FragmentThree и возврата к Two? Или после возвращения в One? Пожалуйста, будьте конкретны.   -  person ianhanniballake    schedule 29.05.2021


Ответы (1)


person    schedule
comment
Это то, что фрагменты уже делают для вас, когда вы используете addToBackStack(). Выполнение этого вручную абсолютно, на 100% неверно и не обрабатывает вложенные фрагменты и индивидуальная обратная обработка. - person ianhanniballake; 29.05.2021
comment
@ianhanniballake Я на 100% согласен, что это приведет к проблемам в будущем, но это решение основано на их существующей кодовой базе. Каждый раз, когда я предлагал решение, которое не устраняет проблему, но приводит к дизайну, в котором его изначально нет, я отклоняюсь. И, судя по всему, у спрашивающего это сработало. Мой первоначальный ответ, который я не публиковал, полностью покончил с созданием цепочки фрагментов, что привело бы к более удобной в обслуживании структуре управления. - person avalerio; 29.05.2021
comment
Я думаю, что это все равно не сработает - когда на FragmentThree, это одновременно вытолкнет задний стек (у вас будет два) и вызовет super.onBackPressed(), который также вытолкнет стек обратно фрагмента (переведя вас в один), что не то, что вы хотите . - person ianhanniballake; 29.05.2021