16

我正在将我的所有活动转换为片段,以便我可以在 ViewPager 中使用它们。

我已经搜索过这个,但我找不到令人满意的答案,所以我在这里问它。

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

我的问题是:我应该把这段代码放在片段的哪里?在 onCreate()? 创建视图()?onActivityCreated()? 为什么?

提前谢谢了!

4

2 回答 2

23

尽管 Pragnani 的答案很接近,但它几乎没有教育价值。此外,他的第二个陈述还有一个更合适的选择。

我应该把这段代码放在片段的哪里?在 onCreate()? 创建视图()?onActivityCreated()? 为什么?

简短的回答是:要么做,onCreateView()要么onActivityCreated()做。视图层次结构要到 才会创建onCreateView(),因此这是片段生命周期中最早可以膨胀视图并附加点击侦听器等的点。由于onActivityCreated()将始终在 之后运行onCreateView(),这也是一个合适的位置。onCreate()可以跳过有利于系统临时分离片段并重新附加它,例如在保留片段时。

Pragnani 是正确的,他指出膨胀片段的视图与膨胀活动中的视图略有不同。更具体地说:片段没有定义findViewById()方法,因此您需要在其他对象上调用它。

而不是使用getActivity().findViewById(),你会想要getView().findViewById()。这样做的原因是,如果您使用 Activity 进行视图查找,那么当多个具有相同视图 ID 的片段附加到它时,您会遇到麻烦。如果您在各种片段的布局中重用视图 ID,或者如果您显示两个显示不同数据的相同片段,就会出现这种情况。在这两种情况下,只会返回第一个匹配项,而您确实希望在片段的上下文中查找视图。这正是getView()返回的内容,即片段的根视图(您在 中返回的onCreateView()),因此适当地限制了查找的范围。

于 2013-03-07T18:36:27.223 回答
3

1.将 onCreate 留空,只需调用 super.onCreate()

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

 Do all other operations in onCreateview()
于 2013-03-07T17:41:15.223 回答