如何在片段中嵌套 ViewPager2
HowTo Nest ViewPager2 within a fragment
我正在尝试在我的主要片段中放置一个带有 2 个选项卡(2 个片段)的 ViewPager2。
我的 fragment class 扩展了 Fragment,我需要它包含一个 ViewPager2,其中实现了 fragments。
我无法在网上找到清楚解释这一点的指南,因为所有指南都是在扩展 FragmentActivity 而不是 Fragment 的 classes 中实现的。
例如:https://developer.android.com/training/animation/screen-slide-2#fragment
ViewPager2 是 ViewPager 库的改进版本,它提供了增强的功能并解决了使用 ViewPager 的常见问题。
这种在片段中嵌套 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();
}
我正在尝试在我的主要片段中放置一个带有 2 个选项卡(2 个片段)的 ViewPager2。
我的 fragment class 扩展了 Fragment,我需要它包含一个 ViewPager2,其中实现了 fragments。
我无法在网上找到清楚解释这一点的指南,因为所有指南都是在扩展 FragmentActivity 而不是 Fragment 的 classes 中实现的。
例如:https://developer.android.com/training/animation/screen-slide-2#fragment
ViewPager2 是 ViewPager 库的改进版本,它提供了增强的功能并解决了使用 ViewPager 的常见问题。
这种在片段中嵌套 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();
}