fragment 的生命周期在 viewpager 中是如何工作的?为什么在导航更改时不调用 onStop?

How does fragment's lifecycle works inside viewpager? Why onStop is not called on navigation change?

我正在使用来自 AndroidX 的 ViewPager 2 和同一片段的 4 个实例。我的问题很简单。当我导航到另一个片段时(使用导航抽屉甚至其他东西)。 viewpager 内片段的 OnStop() 、 OnDestroy() 、 OnDettach() 不会被触发。那是为什么呢?如果我想删除已经启动的侦听器,使用其中一种方法,我该怎么做?

例如,我正在使用 GreenRobot 的 EventBus。我正在 OnStart 中注册 EvenBus:

override fun onStart() {
    super.onStart()
    EventBus.getDefault().register(this)
}

并将其从 OnStop 中删除:

override fun onStop() {
    Log.e(TAG, "onStop: ")
    EventBus.getDefault().unregister(this)
    super.onStop()
}

但是当我如上所述离开 viewpager 时,onStop 不会触发。我什至通过日志检查了它。

片段生命周期与 viewpager 的工作方式是否不同?如果是,我该如何解决这个问题(取消注册 EvetBus)。

您可以使用 setUserVisibleHint 检查片段可见性。

  override fun setUserVisibleHint(isVisibleToUser: Boolean) {
    super.setUserVisibleHint(isVisibleToUser)

    if (isVisibleToUser) {

       //Fragment is visible

    } else {

       //Fragment is invisible
    }
}

希望这对您有所帮助。

不幸的是,EventBus 在涉及到其中的 ViewPager 和 Fragments 时并没有提供很大的用处。

虽然我找到了解决方案,但使用的是更传统的方法:接口

它没有直接回答问题为什么在导航更改时不调用 ViewPager 内的片段的 onStop?

但在将 EvenBus 与 ViewPager 一起使用时,它确实可以避免多个事件触发器。使用接口,因为您不必显式注销接口。是否调用 onStop 并不重要。