android-fragments - Android如何在ViewPager中处理 fragment livecycle?

  显示原文与译文双语对照的内容
59 3

这不是一个简单的问题。我会尽可以能地解释自己,所以这可以能会有点长。

解释解释

最近我在 Fragments 和 ViewPager fighting了很多。

我发现的是ViewPager拥有你想要的尽可能多的Fragments 。当第一次实例化它时,取决于类型( 。FragmentStatePagerAdapter vs FragmentPagerAdapter与FragmentPagerAdapter和FragmentStatePagerAdapter之间的差异),它将创建所有 Fragments 或者者只是"所需"。

在这些 Fragments 中,你可以以使用类似 getActivity()的方法,它基本上是创建视图。查找视图。显示对话框的上下文。

但是,一旦你离开 fragment,getActivity() 就开始返回 null,因为 fragment 是来自 Activity的dettached 。声音逻辑。

但是,对于我来说,听起来有些不合逻辑,因此在这里,当回到 fragment 页面( 或者接近) 时,再次触发基本方法,比如 onAttach

一旦你有 onAttach,你可以以保持 Activity 提供的上下文,但如果你尝试执行如下( 伪代码) 操作:

class MyFragment extends Fragment
{
 private Context context;
 private doThingsAfterAttach()
 {
 getActivity();//this is null.
 null!= context;//TRUE
 }
 @Override
 public onAttach( Activity activity )
 {
 context = activity;
 doThingsAfterAttach();
 }
}

你可以以看到,即使 getActivity() 在触发 onAttach 后调用这里方法,也会返回 null 。

如果决定将保存上下文转换为 Activity,执行 findViewById 任务,则会看到你想查找的视图为 null 。

问题

假设你有一个 ViewPager,其中包含 5个标签( Fragments ) 。在任何 5个选项卡上执行任务时,你需要通知"持有者"Activity,以便通知所有应该更新它的内容的Fragments 。但是当你通知他们,如果他们必须改变布局,他们不能做,因为你尝试 findViewById,两件事可以以发生:getActivity() 返回 null,因这里无法获取视图,如果将上下文转换为 Activity,则在搜索任何视图时不返回视图。

当你旋转设备时,使我感到吓人,就像离开 fragment 页面和返回,"失去"Activity 。

真正的问题

所以我要找的是一个解释内部发生的事情,所以我可以以找到适当的代码来处理这些情况。

我提供的代码不多,因为它是无用的。谁使用ViewPager和 Fragments,很可能处理这些事情,所以你会理解我。

谢谢,我已经准备好回答你的问题了。

谢谢。

时间:原作者:0个回答

96 4

我认为 getActivity() 返回空 onAttach(),因为你没有调用它,因为它没有机会将它设置为 Activity 。也不需要调用 getActivity() 查找视图,可以以在 onCreateView() 上保留引用,如果有任何更改,则在 onStart() 上更新它们。

同样保持 Activity 上下文为全局将防止 fragment 被垃圾收集,只要 Activity 存在。所以在 onDetach() 上释放引用。

原作者:
...