Как вернуть несколько фрагментов из FragmentPagerAdapter

Если я использую TabLayout с FragmentPagerAdapter, переопределенная функция getItem(int position) просто возвращает один фрагмент. В случае большого экрана я хотел бы вернуть 2 фрагмента. Как мне это сделать? следует обернуть эти 2 фрагмента в один фрагмент и использовать его вместо этого или есть лучшее решение?

FragmentPagerAdapter:

public class SectionsPagerAdapter extends FragmentPagerAdapter {

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0: //Ingredients
                return IngredientsFragment.newInstance(mRecipe);
            case 1: // Details
            {
                // TODO Here instead of DetailFragment I want to return
                // two fragments called DetailFragment and StepFragment.
                return DetailFragment.newInstance(mRecipe);
            }
            default:
                throw new RuntimeException(this.toString() + " Wrong fragment!");
        }
    }

А затем в моем действии onCreate:

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        // Initializing, etc.

        mSectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
        mViewPager.setAdapter(mSectionsPagerAdapter);

        TabLayout tabLayout = findViewById(R.id.tabs);
        mViewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
        tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(mViewPager));
    }

person WonderfulMe    schedule 03.05.2018    source источник
comment
Я думаю, что возвращение фрагмента, который обертывает два других, является разумным решением.   -  person Zharf    schedule 03.05.2018


Ответы (2)


Я не вижу, чтобы у вас было много места для маневра.

Эти два варианта являются эксклюзивными:

  1. Вы возвращаете один фрагмент с двумя вложенными фрагментами (завернутый фрагмент)
  2. Вы возвращаете два фрагмента, каждый из которых привязан к своей вкладке.

Если вы хотите, чтобы на одной странице ViewPager отображались два фрагмента, у вас нет другого выбора, кроме как обернуть их. В противном случае свайп шел бы между этими двумя фрагментами, что равносильно тому, как если бы они были совершенно разными, то есть некоррелированными.

person Gotiasits    schedule 03.05.2018

Хорошо, мне удалось решить проблему, используя Fragment, состоящий из двух других фрагментов в качестве дочерних элементов. Только не забывайте, что в этом случае объект FragmentManager должен быть заполнен getChildFragmentManager() для правильной работы. Для получения дополнительной информации посмотрите мой проект BakingApp DetailStepWideScreenFragment.java

Репозитории GitHub

Упаковщик фрагментов:

public class DetailStepWideScreenFragment extends Fragment {
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_detail_step_wide_screen, container, false);

        // I added the fragments here. StepFragment can be replaced using
        // replaceStepFragment function.
        DetailFragment detailFragment = DetailFragment.newInstance(mRecipe);
        StepFragment stepFragment = StepFragment.newInstance(mRecipe, mStepId);
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        transaction.add(R.id.fl_detail_fragment_wide_screen, detailFragment);
        transaction.add(R.id.fl_step_fragment_wide_screen, stepFragment);
        transaction.commit();

        return view;
    }

    public void replaceStepFragment(String stepId) {
        mStepId = stepId;
        FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
        StepFragment stepFragment = StepFragment.newInstance(mRecipe, mStepId);
        transaction.replace(R.id.fl_step_fragment_wide_screen, stepFragment);
        transaction.commit();
    }
}

Адаптер пейджера:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    private DetailStepWideScreenFragment currentFragment;

    public SectionsPagerAdapter(FragmentManager fm) {
        super(fm);
        currentFragment = null;
    }

    @Override
    public Fragment getItem(int position) {
        switch (position) {
            case 0: //Ingredients
                return IngredientsFragment.newInstance(mRecipe);
            case 1: // Details
            {
                // Show base on screen size.
                if (mIsLargeScreen) {
                    DetailStepWideScreenFragment detailStepWideScreenFragment = DetailStepWideScreenFragment.newInstance(mRecipe, "0");
                    currentFragment = detailStepWideScreenFragment;
                    return detailStepWideScreenFragment;
                } else {
                    return DetailFragment.newInstance(mRecipe);
                }
            }
            default:
                throw new RuntimeException(this.toString() + " Wrong fragment!");
        }
    }

    @Override
    public int getCount() { return 2; }

    public DetailStepWideScreenFragment getCurrentFragment() {
        return currentFragment;
    }

}
person WonderfulMe    schedule 03.05.2018