Android Fragments 如何在片段中嵌套ViewPager2

gstyhher  于 2023-11-19  发布在  Android
关注(0)|答案(2)|浏览(142)

我试图把一个ViewPager2与2标签(2片段)在我的主要片段。
我的片段类扩展了Fragment,我需要它包含一个ViewPager2,里面实现了片段。
我在网上找不到解释这一点的指南,因为所有这些都是在扩展FragmentActivity而不是Fragment的类中实现的。
例如:https://developer.android.com/training/animation/screen-slide-2#fragment

qcbq4gxm

qcbq4gxm1#

ViewPager2是ViewPager库的改进版本,提供了增强的功能,并解决了使用ViewPager的常见困难。
Web上缺少这种在片段中嵌套ViewPager2的实现,因为Android开发人员指南显示了Activity中的实现。
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();
}

twh00eeo

twh00eeo2#

在你的父片段xml中。添加viewpager2。创建它的适配器扩展FragmentStateAdapter。实现方法。
map被添加到保存你在开始时创建的片段的相同示例,它总是会创建一个新的片段。使用map,所以每次都得到相同的片段示例。

private final Map<Integer, Fragment> fragmentMap;

字符串
public int findDuplicate(int [] nums){

Fragment cachedFragment = fragmentMap.get(position);
    if (cachedFragment != null) {
        return cachedFragment;
    }
    switch (position) {
        case 0:
            cachedFragment = new childfragment1();
            break;
        case 1:
            cachedFragment = new childfragment2();
            break;
        case 2:
            cachedFragment = new childfragment3();
            break;
        default:
            cachedFragment = null;
    }

    fragmentMap.put(position, cachedFragment);
    return cachedFragment;
}

相关问题