Как вкладывать ViewPager2 во фрагмент - PullRequest
2 голосов
/ 31 марта 2020

Я пытаюсь поместить ViewPager2 с 2 вкладками (2 фрагментами) в мой основной фрагмент.

Мой класс фрагмента расширяет Fragment, и мне нужно, чтобы он содержал ViewPager2 с фрагментами, реализованными внутри.
I не удалось найти руководства, объясняющие это в Интернете, поскольку все они реализуются в классах, расширяющих FragmentActivity, а не Fragment.

Например: https://developer.android.com/training/animation/screen-slide-2#fragment

1 Ответ

1 голос
/ 12 апреля 2020

ViewPager2 - это улучшенная версия библиотеки ViewPager, которая предлагает расширенные функциональные возможности и решает общие проблемы с использованием ViewPager.
Такие реализации для вложения ViewPager2 во фрагмент отсутствуют в Интернете, поскольку Android Руководство разработчика показывает реализацию в пределах действия.

1) Ваш макет основного фрагмента должен иметь ViewPager2, добавленный в его XML файл следующим образом:

<com.google.android.material.tabs.TabLayout
        android:id="@+id/tabs"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
<!-- Tabs widget can be removed if you don't need tabs on top of pager-->
    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/myPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_below="@+id/tabs" />

2) Следующий шаг - подготовить наш FragmentStateAdapter для установки это как адаптер ViewPager2:

public class ViewPagerAdapter extends FragmentStateAdapter {

    private final Fragment[] mFragments = new Fragment[] {//Initialize fragments views
//Fragment views are initialized like any other fragment (Extending Fragment)
                new FirstPagerFrag(),//First fragment to be displayed within the pager tab number 1
                new SecondPagerFrag(),
        };
        public final String[] mFragmentNames = new String[] {//Tabs names array
                "First Tab",
                "SecondTab"
        };

        public ViewPagerAdapter(FragmentActivity fa){//Pager constructor receives Activity instance
            super(fa);
    }

    @Override
    public int getItemCount() {
        return mFragments.length;//Number of fragments displayed
    }

    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

    @NonNull
    @Override
    public Fragment createFragment(int position) {
        return mFragments[position];
    }
}

3) Присоединение адаптера к ViewPager2 Эта часть реализована в нашем фрагменте, который содержит ViewPager2:

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

    mViewPager = view.findViewById(R.id.queueContainer);//Get ViewPager2 view
    mViewPager.setAdapter(new ViewPagerAdapter(getActivity()));//Attach the adapter with our ViewPagerAdapter passing the host activity

    TabLayout tabLayout = view.findViewById(R.id.tabs);
    new TabLayoutMediator(tabLayout, mViewPager,
            new TabLayoutMediator.TabConfigurationStrategy() {
                @Override
                public void onConfigureTab(@NonNull TabLayout.Tab tab, int position) {
                    tab.setText(((ViewPagerAdapter)(mViewPager.getAdapter())).mFragmentNames[position]);//Sets tabs names as mentioned in ViewPagerAdapter fragmentNames array, this can be implemented in many different ways.
                }
            }
    ).attach();
}
...