Как вернуть несколько фрагментов из FragmentPagerAdapter - PullRequest
0 голосов
/ 03 мая 2018

Если я использую 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!");
        }
    }

А потом в моей деятельности по созданию:

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

Ответы [ 2 ]

0 голосов
/ 03 мая 2018

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

GitHub Repos

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

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

PagerAdapter:

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

}
0 голосов
/ 03 мая 2018

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

Эти два варианта являются исключительными:

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

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

...