【问题标题】:Lifecycle of Fragment that holds a ViewPager持有 ViewPager 的 Fragment 的生命周期
【发布时间】:2015-07-01 21:45:17
【问题描述】:

我有一些让我难过的事情。我有一个带有 ViewPager 的片段(片段 A),其中包含三个片段(用于向左/向右滑动)。因此,如果在另一个片段中,在 onBackPressed() 方法中,我执行 getFragmentManager().popBackStack() 调用,片段 A 将再次可见(使用ViewPager of sub-fragments) 这是期望的状态。但是,对于 Fragment A 或 ViewPager 中没有任何方法表明 Fragment A/ViewPager 再次可见。

片段生命周期 (http://developer.android.com/guide/components/fragments.html) 中引用的任何片段方法都不应在“片段从后台堆栈返回布局”或在 OnPageChangeListener 中调用的任何方法时调用(是的,我确实调用 viewPager.片段 A 的 onCreateView 中的 setOnPageChangeListener(this)。

想过我可以在哪里看吗?

【问题讨论】:

  • 这是您描述的情况吗? Frag-A 及其子片段是可见的。某些事件导致它们被 Frag-B 删除/替换并放入后台堆栈,使它们不可见。用户按下返回,导致 Frag-A 及其子片段从后台堆栈恢复到布局,使它们再次可见。一切正常,但您不知道如何确定 Frag-A 及其子片段是否可见。您链接的片段指南中的生命周期图显示了片段进入或退出后台堆栈时调用的方法。你不能从中得到可见的状态吗?
  • 是的,您在所有方面都是正确的。不遵循 Android 文档中定义的生命周期。当 Frag-A 和包含的子片段的 ViewPager 可见时,这些方法都不会被调用。

标签: android android-fragments android-viewpager fragment-lifecycle


【解决方案1】:

我有一个带有ViewPager 的应用程序,它被添加到布局中,然后被另一个片段替换,并将更改添加到事务返回堆栈中。我在寻呼机的每个生命周期方法中都有 Log 语句。当按下后退按钮并且寻呼机返回到布局时,我的logcat 输出显示为寻呼机调用的这些方法:onCreateView()onActivityCreated()onStart()onResume()。注意,当一个fragment进入back stack时,它的view被销毁了,但是fragment对象没有被销毁,所以当fragment从back stack返回时,没有调用onCreate()

此行为与Fragment Guide 中的生命周期图一致。您应该能够使用对onResume() 的调用来指示您的寻呼机可见。我只能建议您将调试输出添加到寻呼机的生命周期方法中并查看输出。如果您认为它是错误的,请将其添加到您的问题的帖子中。还要指出您正在使用的片段事务方法。如果您偶然使用hide() 而不是remove()replace(),则生命周期事件不同,您可能需要使用onHiddenChanged()

【讨论】:

  • 我很高兴听到它,但就我而言,这些方法不会被调用。我在这些方法中也有两个日志消息,并且我也尝试过调试停止,在这两种情况下都没有任何乐趣。这就是 StackOverflow 问题的原因。
  • 关于我使用的片段事务方法是Fragment fragment = (Fragment) clazz.newInstance(); FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.tab_fragment, fragment).addToBackStack(fragmentName); fragmentTransaction.commit();
  • 听起来很奇怪。当您退出(完成)包含该片段的活动时,您是否看到对片段拆解的生命周期方法的调用?同样,当第一次将分页器添加到布局中时,您是否看到调用了创建生命周期方法?
  • 我在拆解方法中没有日志消息,因为我真的不关心它们。我确实看到了称为 Frag-A 的创建生命周期方法,它的 ViewPager 是首先创建的。
  • 使用您的片段层次结构(子片段是寻呼机的子级,寻呼机是 Frag-A 的子级),您是否使用父级片段的 getChildFragmentManager() 来添加/替换子级?我也想知道您对onBackPress() 的使用。那是在您的活动中,因此您正在弹出活动的片段管理器的堆栈。是否存在您想要弹出孩子的片段管理器的情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-04
  • 1970-01-01
相关资源
最近更新 更多