Android 带有 ViewPager 和 SectionsPageAdapter 方法的片段在用户单击选项卡名称时执行以显示它或滑动到它

Android Fragment with ViewPager and SectionsPageAdapter method executed on user clicks tab name to display it or swipes to it

我一直在尝试确定为什么在使用 ViewPager 和 sectionsPageAdapter 时用户切换要显示的选项卡时 onPause()onResume() 方法没有被触发。

我假设当用户更改正在显示的选项卡时,将调用 onPause()onDestroy() 方法。然后,如果用户 returns 到选项卡,将调用 onResume() 方法,但似乎不是功能...

有什么方法可以判断用户什么时候切换了标签页,并知道切换到了哪个标签页?像 onFragmentBeingDisplayed() 或类似的东西。

谢谢!

编辑:Suraj Vaishnav 的回答

通过像这样编辑 FragmentPageAdapter 的构造函数 super(fm, FragmentPagerAdapter.BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT); 我可以在应用程序上使用所需的行为

这是因为ViewPager在当前片段的左侧和右侧加载了一些片段。默认情况下,ViewPager 在片段的左侧加载一个,在片段的右侧加载一个。您可以通过以下方式更改号码:viewpager.setOfScreenPageLimit(int);

您所想的在 androidx's Fragment 中的工作方式完全相同。意味着 onPauseonResume 将相应地调用。所以第一个建议是使用androix。检查这个答案:

出于某种原因,如果您不想使用 androidx,那么在您的 Fragment 中,覆盖 setUserVisibleHint 方法,该方法为您提供 isVisibleToUser 作为参数。

如果您不想使用 Androidx 版本的 Viewpager 来使用 BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 行为来仅在显示的 Fragment 上触发 onResume,那么您可以添加一个 addOnPageChangeListener

您可以使用 ViewPager.SimpleOnPageChangeListener 或您自己实现的 ViewPager.OnPageChangeListener 接口。

这个 PageChangeListener 有一个 onPageSelected 方法,在选定的位置调用。

虽然我提供了指向 Androidx 文档的链接,但它也适用于早期的支持库,只是 Google 删除了它的文档,因为他们希望您使用 Androidx

请注意 ViewPager.OnPageChangeListener onPageSelected 的触发时间与 onResumeBEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT 的触发时间略有不同。当 onResume 100% 的新标签在屏幕上时触发时,约 50% 的新标签在屏幕上滑动时触发。