Android 片段生命周期

Posted

技术标签:

【中文标题】Android 片段生命周期【英文标题】:Android Fragment Life Cycle 【发布时间】:2014-07-28 00:35:00 【问题描述】:

我有一个带有 3 个导航选项卡的操作栏:Fragment 1、Fragment 2 和 Fragment 3。现在,我想在选择 Fragment 3 时执行一项任务,因此我将任务代码放在 onCreateView() 方法中。但是,我发现 Fragment 3 没有执行任务,这意味着没有调用 onCreateView() 方法。 (我通过记录来检查)。另一个奇怪的事情是: - 当我滑动:F2-> F3:任务不工作。 - 当我滑动时:F1->F2->F3:任务工作。 (调用 onCreateView() 方法) 不知道为什么从F1滑到F3时会调用F3的onCreateView()方法? 对此有何想法?

【问题讨论】:

【参考方案1】:

tyczj 的评论是正确的,但它并没有解决问题。

在您的 F3 中,只需覆盖 setUserVisibleHint(boolean),当布尔值为真时,这意味着 F3 现在在 ViewPager 内可见。 请注意,您可以依赖此方法,因为您使用的是 ViewPager,并且它在显示片段时正确设置了用户可见提示。

当你不使用 ViewPager 时,你不能依赖这个方法,除非你在知道片段可见时显式调用该方法。

编辑:setUserVisibleHint() 不是由 ViewPager 调用,而是由 FragmentPagerAdapter 调用。

【讨论】:

系统是先调用setUserVisibleHint()方法还是先调用onCreateView()?如果我知道这一点,我可以将我的代码放入正确的方法中。 如果您使用 ViewPager,onCreateView() 将首先被调用,此时片段将被创建。就像 tyczj 所说的,即使不可见,也可以创建片段,以确保平滑滚动。然后 setUserVisibleHint() 将在片段将被滚动时调用。此方法由 ViewPager 调用,而不是由系统直接调用。 请注意,setUserVisibleHint()实际上是由FragmentPagerAdapter调用的。 grepcode.com/file/repo1.maven.org/maven2/com.google.android/…【参考方案2】:

因为ViewPager 会加载下一个视图,以便在您想要滚动到下一个片段时它已准备好。默认情况下,viewpager 会在 ViewPager 中加载上一个当前片段和下一个片段,因此当您从 F1 滚动到 F2 时,将加载 F3 以便在您转到 F3 时平滑滚动

【讨论】:

【参考方案3】:

上一个答案告诉您为什么您正在做的事情不起作用。但要更正它,您需要创建一个 AsyncTaskLoader 并使用 Fragments LoaderManager 来加载和管理任务。见http://developer.android.com/guide/components/loaders.html

【讨论】:

以上是关于Android 片段生命周期的主要内容,如果未能解决你的问题,请参考以下文章

Android 生命周期 - 我的想法正确吗?

在不存在的片段上调用片段生命周期和 onCreate 的问题

fragment生命周期

Android Jetpack -- Lifecycles篇

了解活动生命周期

React Native 中的 Android Activity 生命周期 - ViewPager