如何使用 ViewPager2 直接转到特定片段

How to go directly to a specific fragment using ViewPager2

我正在尝试使用 Viewpager2 创建一个应用程序,它允许在类似于下图的片段之间滚动,但没有顶部的 tablayout。

因此,如果您左右滚动,您将在片段之间切换。很好很花花公子。

但是我的最终应用程序会有 5 个以上的选项卡,所以我不希望选项卡布局列在顶部。相反,我会有一个菜单选项,让用户选择要查看的片段。

我不知道如何让 viewpager 直接转到特定片段(例如,从第 2 个片段到第 5 个片段),并且在片段之间导航时我不希望片段从头开始,如果已创建。

我正在将 FragmentStateAdapter 与我的 ViewPager2 一起使用。我应该为此使用另一个适配器吗?任何想法都会很棒。

您可以使用 viewpager2 的 setCurrentItem method of your ViewPager2. Just pass the index your wish to navigate to starting from 0. As for not wanting the fragments to start from scratch simply use setOffscreenPageLimit 方法并将其设置为 4,以防您有 5 个页面,以便所有 5 个页面都保留在内存中。不过,它实际上违背了 FragmentStateAdapterViewPager2 的目的。

实现此功能的最简单方法是在 activity 中将 ViewPager 定义为静态(这样您就可以从应用程序的任何位置访问它,包括片段)。您可以将其设为 public,也可以将其设为私有并为其创建一个 getter。

private static ViewPager mViewPager; // This is the global variable 
public static ViewPager getViewPager() { return mViewpager; } // This is the getter

现在假设我们有一个包含 ViewPager 的 activity MainActivity。此 ViewPager 中的每个片段都包含一个应该控制页面的按钮(不必在 ViewPager 中,可以在任何地方,只要它引用了您的 Activity 并且 Activity 仍然存在运行,所以不要开始另一个)。

ViewPager 包含方法

setCurrentItem(int item, boolean smoothScroll)

(smoothScroll 是可选的,仅用于动画目的)

现在你可以做:

MainActivity.getViewPager().setCurrentItem(itemNr);

或者,如果您想要精美的滚动动画:

MainActivity.getViewPager().setCurrentItem(itemNr, true);

现在你的第二个问题/问题是你提到你不希望重新创建片段。在那种情况下,我认为最好使用 FragmentPagerAdapter,它可以维护您的片段。您可以调用以下方法来设置这些页面的限制:

mViewPager.setOffscreenPageLimit(LauncherViewPageAdapter.NUMBER_OF_PAGES); //NUMBER_OF_PAGES was just a static constant in my LauncherViewPageAdapter class which extended ViewPageAdapter.

注意:默认此限制为 3,但您真的不必担心性能问题。我实现了 4 个页面/片段(小部件、磁贴、应用程序列表、应用程序设置),没有任何内存问题(即使在旧设备上)。只是不要让它们充满位图/占用大量内存的东西。

我目前正在开发一个也使用 ViewPager 的启动器应用程序,所以请随时回复有关 ViewPager 的问题,因为我已经解决了我遇到的基本问题。