Fragment中onCreateView和onViewCreated之间的区别

Smi*_*ith 99 android android-layout android-fragments

这两种方法之间的本质区别是什么?当我创建TextView时,我应该使用其中一个来提高性能吗?

编辑:有什么区别

onCreateView() {
  root = some view
  View v = new View(some context);
  root.add(v);
  return root;
}


onViewCreated() {
  View v = new View(some context);
  getView().add(v);
}
Run Code Online (Sandbox Code Playgroud)

Xar*_*mer 62

我们面临一些初始化视图的崩溃onCreateView.

您应该夸大布局,onCreateView但不应使用findViewByIdin 初始化其他视图onCreateView.

因为有时候视图没有正确初始化.因此请务必使用findViewByIdonViewCreated(当完全创建视图),也传递视图参数.

onViewCreated 确保完全创建视图.

  • 该文引自何处?我在官方文档中找不到它. (16认同)
  • 谢谢.我也遇到了这个问题,并使用组件.post`(...)方法等待它显示.可能会在`onViewCreated`中进行findViewById和其他初始化. (3认同)
  • 这实际上是不正确的。您可以在onCreateView中找到视图,但只能在将其放大后再从已经放大的视图中找到。Fragment.findViewById()不安全,但是如果您已经放大了片段视图,则View.findViewById()是安全的。 (2认同)

u3l*_*u3l 36

onViewCreated之后立即调用onCreateView(初始化和创建所有对象的方法,包括你的方法TextView),所以这不是性能问题.

来自开发者网站:

onViewCreated(视图视图,Bundle savedInstanceState)

在onCreateView(LayoutInflater,ViewGroup,Bundle)之后立即调用,但在将任何已保存的状态恢复到视图之前.这使得子类有机会在知道自己的视图层次结构已完全创建后进行初始化.但是,此时片段的视图层次结构不会附加到其父级.

来源:片段#onViewCreated


ora*_*ako 25

最好将子视图分配到字段中onViewCreated.这是因为框架会对您执行自动空检查,以确保您的Fragment视图层次结构已正确创建和膨胀(如果使用XML布局文件).

代码片段:FragmentManger.java

// This calls onCreateView()
f.mView = f.performCreateView(f.getLayoutInflater(f.mSavedFragmentState), null, f.mSavedFragmentState);

// Null check avoids possible NPEs in onViewCreated
// It's also safe to call getView() during or after onViewCreated()
if (f.mView != null) {
    f.mView.setSaveFromParentEnabled(false);
    if (f.mHidden) f.mView.setVisibility(View.GONE);
    f.onViewCreated(f.mView, f.mSavedFragmentState);
}
Run Code Online (Sandbox Code Playgroud)

  • 它还将任何初始化逻辑与视图层次结构通胀/创建逻辑分开 (4认同)

Fan*_*mas 16

onCreateView()是 Fragment 等价onCreate()于活动并视图创建期间运行。创建视图
onViewCreated()运行。

should I use one over the other for performance? 。没有性能提升的证据。

onCreate()Fragments 中实际上也有一个方法,但它很少使用(我从不使用它,也没有找到很好的用例)。

我总是onCreateView()在 Fragments 中使用作为onCreate().
我对此很满意。

  • @npace,为什么?我也认为 `onCreateView` 相当于 Activity 的 `onCreate`。 (2认同)
  • @CoolMind 好吧,nPace 并不是*完全* 错误,因为 Framents 中也有一个 `onCreate()` 方法。但它**从不**使用(或者,至少,我确实**从不**使用它)。我总是在 Fragments 中使用 `onCreateView()` 作为替代。 (2认同)

Bla*_*elt 12

onCreateView返回膨胀的视图.OnViewCreated刚刚调用后onCreateView得到参数的膨胀视图.它的返回类型是void

  • onCreateView应该快速返回.例如,OnViewCreate可用于执行初始化操作.正如我所说的,onViewCreated有一个参数,你在onCreateView里面充气.所以你可以避免`getView`调用 (3认同)

Pep*_*L-G 12

Fragment.onCreateView()现在的文档说:

建议只在此方法中对布局进行膨胀,并将对返回的 View 进行操作的逻辑移动到 onViewCreated(View, Bundle)。

我们不需要理解为什么;我们只需要按照文档说的去做,但是知道为什么存在这个建议会很有趣。我最好的猜测是关注分离,但恕我直言,这使它比它必须的复杂一点。


小智 8

  • 好的,如果我们要讨论onCreateView()onViewCreated()。值得讨论一下片段生命周期。有关片段生命周期的完整文档可以在这里找到,我建议您阅读它,因为我们只会讨论与onCreateView()和相关的状态onViewCreated()

  • Fragment 生命周期包含 5 个状态:

  • 1) 初始化

  • 2) 已创建

  • 3)开始

  • 4) 恢复

  • 5) 被毁

  • 我们需要讨论片段生命周期的原因是因为 和onCreateView()都在生命周期的状态onViewCreated()期间被调用。CREATED

  • 因此,当实例化片段时,它会从INITIALIZED状态开始,例如当您看到:

CustomFragment frag1 = new CustomFragment() //`INITIALIZED` state
CustomFragment.class                        //`INITIALIZED` state

Run Code Online (Sandbox Code Playgroud)
  • 语法.class就是class literal语法,为了进行简要总结,我建议阅读此处的博客文章

  • 为了使片段转换到其他生命周期状态,必须将其添加到Fragment Manager.

片段管理器负责确定其片段应处于什么状态,然后将它们移动到该状态。

onCreateView() 和 onViewCreated() 之间的区别

  • 一旦片段被添加到片段管理器,onAttach()就会调用将片段附加到主机活动。

  • 一旦onAttch()被调用,片段就进入状态CREATED。Android 系统正是在这种状态下开始创建fragment 的视图。这可以通过几种方式完成,例如文档指出

在大多数情况下,您可以使用采用 @LayoutId 的片段构造函数,它会在适当的时间自动膨胀视图。您还可以重写 onCreateView() 以编程方式膨胀或创建片段的视图

  • 如果我们查看文档,我们会onCreateView()发现:

建议仅在此方法中膨胀布局,并将对返回的 View 进行操作的逻辑移至 onViewCreated

结论

  • 现在结合一切我们可以得出结论,两者onCreateView()都在片段生命周期的状态onViewCreated()期间被调用。CREATED但是,onCreateView()首先被调用,并且只能用于扩展片段的视图。onViewCreated()第二个被调用,所有与膨胀视图上的操作相关的逻辑都应该在这个方法中。