【问题标题】:HowTo Nest ViewPager2 within a fragment如何在片段中嵌套 ViewPager2
【发布时间】:2020-03-31 18:47:58
【问题描述】:

我正在尝试在我的主要片段中放置一个带有 2 个选项卡(2 个片段)的 ViewPager2。

我的片段类扩展了 Fragment,我需要它包含一个 ViewPager2,其中实现了片段。
我在网络上找不到明确解释这一点的指南,因为它们都是在扩展 FragmentActivity 而不是 Fragment 的类中实现的。

例如:https://developer.android.com/training/animation/screen-slide-2#fragment

【问题讨论】:

    标签: android android-fragments android-viewpager2


    【解决方案1】:

    ViewPager2 是 ViewPager 库的改进版本,它提供了增强的功能并解决了使用 ViewPager 的常见困难。
    由于 Android 开发人员指南显示了 Activity 中的实现,因此 Web 上缺少将 ViewPager2 嵌套在片段中的此类实现。

    1) 您的主要片段布局必须在其 XML 文件中添加一个 ViewPager2,如下所示:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      相关资源
      最近更新 更多