FragmentManager в адаптере RecyclerView - PullRequest
0 голосов
/ 02 мая 2020

У меня есть активность с ViewPager, который содержит 2 вкладки. Каждая вкладка является фрагментом хоста, который имеет 2 дочерних фрагмента. Первые фрагменты - это взгляды переработчика, которые открывают другие фрагменты с помощью FragmentTransactions. У меня проблемы с созданием разных backstacks для них.

Таким образом, в моем адаптере утилита просмотра в onBindViewHolder у меня есть onclicklistener, подобный следующему:

        holder.image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                FirstFragment fragment1 = new FirstFragment();
                SecondFragment fragment2 = new SecondFragment();
                FragmentManager fm = ((FragmentActivity) view.getContext()).getSupportFragmentManager();
                FragmentTransaction transaction = fm.beginTransaction();

                transaction
                        .replace(R.id.frame_container, fragment2,"Tag")
                        .addToBackStack(null)
                        .commit();
            }
        });

Если я сделаю транзакцию, подобную этой, из утилита просмотра, backstack будет одинаковым для обеих вкладок, поэтому если я открою вторые фрагменты на tab1, то на tab2, если я go вернусь к tab1 и нажму назад, второй фрагмент на tab2 выскочит изнутри.

Если я сделаю кнопку в FirstFragment за пределами Просмотрите и сделайте фрагмент транзакции из FirstFragment следующим образом:

button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final FragmentTransaction ft = getFragmentManager().beginTransaction();
                ft.replace(R.id.frame_container, SecondFragment.newInstance(), "Tag");
                ft.addToBackStack(null);
                ft.commit();
            }
        });

, тогда он будет работать, как задумано, но я хочу сделать это из обзора переработчика.

Есть ли способ, которым это можно сделать

1 Ответ

0 голосов
/ 02 мая 2020

Вы должны нести свой элемент click logi c listener во фрагмент хоста вкладки. Затем в обоих ваших фрагментах хоста вы должны выполнить требуемую транзакцию, используя дочерний менеджер фрагментов. Таким образом, транзакции хранятся в заднем стеке фрагментов хоста. Затем вы должны управлять этими различными стеками, такими как стек фрагментов действия, стек фрагментов хоста 1 и стек фрагментов хоста 2. Для этого вам нужно переопределить onBackPressed в своей активности, а затем спросить текущий видимый фрагмент хоста, есть ли транзакция. Если есть, вы должны извлечь эту транзакцию и вернуться в обратный вызов onBackPressed. Если нет действия, позволяющего операции обрабатывать событие, вызывая super.

...