安卓:在片段中放置活动的onCreate()代码的位置在哪里?

16

我正在将所有的Activity转换成Fragment,以便在ViewPager中使用。

我已经搜索过了,但是没有找到令人满意的答案,所以我在这里提问。

在我的Activity中,我写了一些代码在onCreate()方法中。例如,我调用一些findViewById()来将一些XML按钮链接到我的Activity。我还在onCreate()中使一些视图不可见,设置一个OnClickListener(),填充一个TextView文本并移除通知。

我的问题是:我应该把这些代码放在Fragment的哪个位置?在onCreate()、onCreateView()还是onActivityCreated()中?为什么?

非常感谢!

2个回答

23

虽然Pragnani的回答很接近,但其中没有多少教育价值。此外,他的第二个陈述有更合适的选项。

我应该把这段代码放在片段的哪里?在onCreate()中?在onCreateView()中?在onActivityCreated()中?为什么?

简短的答案是:无论是onCreateView()还是onActivityCreated()都可以。视图层次结构直到onCreateView()才会创建,因此这是片段生命周期中最早可以膨胀视图并附加单击侦听器等的时间点。由于onActivityCreated()始终在onCreateView()之后运行, 因此那也是一个合适的位置。onCreate()可能会被跳过,而系统会暂时分离片段并重新附加它,例如当保留片段时。

Pragnani是正确的,他指出在Fragment中填充视图与在Activity中填充视图略有不同。更具体地说:Fragment没有定义findViewById()方法,因此你需要在其他对象上调用它。

与其使用getActivity().findViewById(),你应该使用getView().findViewById()。原因是,如果你使用Activity进行视图查找,当多个具有相同视图ID的Fragment附加到Activity上时,你会遇到麻烦。如果你在各自的Fragment布局中重复使用视图ID,或者显示两个显示不同数据的相同Fragment,那么在这两种情况下,只会返回第一个匹配项,而你实际上希望在Fragment的上下文中查找视图。这正是getView()所返回的,即Fragment的根视图(你在onCreateView()中返回的),从而适当地限制了查找范围。


非常感谢您的全面回答!这正是我所需要的! - Xander
我无法在onCreateView()中调用getView(),它会给我一个NullPointerException。 - Xander
没错:getView()onCreateView() 返回之前不会被设置 - 或许我应该更明确地说明一下。然而,由于你正在 onCreateView() 中填充根视图,所以你不应该调用 getView(),而是直接在最终返回的视图上调用 findViewById()。例如,请参见 CountingFragment - MH.
不要使用 getActivity().findViewById(),而是使用 getView().findViewById(),这才是关键。非常感谢,整天我都在想为什么我的 ViewPager 没有正常工作,原来是我在使用 getActivity() 来查找 fragment 的视图。我认为只应该使用 getView() 来查找 Fragment 视图。 - Muhammad Babar

3

1. 将onCreate方法保持空白,只需调用super.onCreate()。

2. 在需要视图上下文的地方始终使用getActivity(),而不是findViewById()。请改用getActivity().findViewById()。

 Do all other operations in onCreateview()

完全与这份文档 https://github.com/thecodepath/android_guides/wiki/Creating-and-Using-Fragments 所说的相反。 - tsil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接