如何使用 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 个页面都保留在内存中。不过,它实际上违背了 FragmentStateAdapter
和 ViewPager2
的目的。
实现此功能的最简单方法是在 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 的问题,因为我已经解决了我遇到的基本问题。
我正在尝试使用 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 个页面都保留在内存中。不过,它实际上违背了 FragmentStateAdapter
和 ViewPager2
的目的。
实现此功能的最简单方法是在 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 的问题,因为我已经解决了我遇到的基本问题。