OnCreateView 与 onViewCreated 在片段中的区别

这两种方法的本质区别是什么?当我创建一个 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);
}
131128 次浏览

onCreateView返回膨胀视图。OnViewCreatedonCreateView之后被调用,并且得到了充气视图的参数。它的返回类型是 void

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

来自开发商网站:

OnViewCreated (视图,Bundle SavedInstanceState)

在 onCreateView (Layoutflater、 ViewGroup、 Bundle)返回之后,但在将任何保存的状态还原到视图之前立即调用。一旦子类知道它们的视图层次结构已经完全创建,它们就有机会对自己进行初始化。然而,此时片段的视图层次结构并没有附加到它的父级。

资料来源: 片段 # onViewCreated

onCreateView()是活动 onCreate()的片段等价物,并运行 期间的视图创建。
onViewCreated()运行 之后视图已被创建。

没有证据表明性能有所提升。

片段中实际上也有一个 onCreate()方法,但是使用的是 很少(我确实使用了 永远不会,但是也没有找到一个很好的用例)。

我总是在片段中使用 onCreateView()作为 onCreate()的替代品。
我很满意。

最好在 onViewCreated中为字段分配子视图。这是因为框架为您执行了一个自动 null 检查,以确保片段的视图层次结构已经创建并充满(如果使用 XML 布局文件)。

代码片段来自: 片段管理器.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);
}

我们在 onCreateView中面临一些初始化视图的崩溃。

您应该在 onCreateView中充气布局,但不应该在 onCreateView中使用 findViewById初始化其他视图。

因为有时视图没有正确初始化。因此,始终在 onViewCreated中使用 findViewById(当视图完全创建时) ,它还将视图作为参数传递。

onViewCreated是确保完全创建了视图。

OnViewCreated android 文档

在返回 onCreateView(android.view.LayoutInflater, android.view.ViewGroupandroid.os.Bundle)之后,但在将任何保存的状态还原到视图之前立即调用。一旦子类知道它们的视图层次结构已经完全创建,它们就有机会对自己进行初始化。然而,此时片段的视图层次结构并没有附加到它的父级。

OnCreateView 在片段中用于创建布局和充气视图。 OnViewCreated 用于引用上述方法创建的视图。 最后,在 onActivityCreated 中定义动作侦听器是一个很好的实践。

我使用 onViewCreated的主要原因是因为它将任何初始化逻辑从视图层次结构膨胀/创建逻辑中分离出来,这些逻辑应该放在 onCreateView中。所有其他性能特征看起来都一样。

我认为它们之间的主要区别在于,当你在 OnCreateView ()中使用 kotlin.in 时,每次你想访问 xml 文件中的视图时,你应该使用 找到 ViewById,但是在 OnViewCreated中,你只需要调用它的 id 就可以访问你的视图。

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

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

我们没有必要去理解为什么; 我们只需要按照文件所说的去做,但是了解为什么这个建议存在是很有趣的。我最好的猜测是 分开关心,但恕我直言,这使它比实际情况要复杂一些。

谷歌文档

有一种新的解决方案可以在片段超类中声明 xml 资源

class ExampleFragment : Fragment(R.layout.example_fragment) { }

然后在 onViewCreate 中绑定视图

private lateinit var binding : ExampleFragmentBinding


override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
binding = ExampleFragmentBinding.bind(view)
}

通过这种方式,您不需要在 onCreatedView 中膨胀视图或在 onDestroy 中处理视图

  • 好,如果我们要讨论 onCreateView()onViewCreated()。值得谈一谈片段生命周期。关于片段生命周期的完整文档可以在 给你中找到,我建议您仔细阅读,因为我们将只讨论与 onCreateView()onViewCreated()相关的状态。

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

  • 1)初始化

  • 2)创造

  • 3)开始

  • 4)恢复

  • 5)毁灭

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

  • 因此,当一个片段被实例化时,它开始于 INITIALIZED状态,例如,当您看到:

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


  • .class语法是 class literal语法,作为一个简短的总结,我建议你阅读博客文章 < a href = “ https://dev.to/theplebdev/java-Quick ie-The-class-熟练的语法 -1fib”rel = “ noReferrer”> HERE

  • 对于要转换到其他生命周期状态的片段,必须将其添加到 Fragment Manager中。

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

OnCreateView ()和 onViewCreated ()的区别

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

  • 一旦 onAttch()被调用,片段就进入 CREATED状态。Android 系统正是在这种状态下开始创建片段视图。这可以通过几种方式实现,例如 文件说明:

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

  • 如果我们看 文件onCreateView(),我们会看到:

建议仅使此方法中的布局膨胀,并将操作返回的 View 的逻辑移动到 onViewCreated

结论

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