这两种方法之间的本质区别是什么?创建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);
}
这两种方法之间的本质区别是什么?创建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);
}
Answers:
我们会遇到一些崩溃,初始化中的视图onCreateView。
您应该在中增加布局,
onCreateView但不应使用findViewByIdin 初始化其他视图onCreateView。
因为有时视图没有正确初始化。因此,请始终使用findViewByIdin onViewCreated(当完全创建视图时),并且还会将视图作为参数传递。
onViewCreated 确保已完全创建视图。
onViewCreated android文档
在onCreateView(android.view.LayoutInflater, android.view.ViewGroup,android.os.Bundle)返回之后,但尚未将任何保存状态恢复到视图中之前立即调用。一旦子类知道其视图层次结构已完全创建,这将给子类一个初始化自身的机会。但是,此时片段的视图层次结构尚未附加到其父级。
post(...)方法等待显示。可能会在中进行findViewById和其他初始化onViewCreated。
onViewCreatedonCreateView(您初始化并创建所有对象(包括TextView)的方法)之后立即调用,因此这与性能无关。
从开发者站点:
onViewCreated(视图,捆绑了saveInstanceState)
在onCreateView(LayoutInflater,ViewGroup,Bundle)返回之后,但在任何保存的状态恢复到视图之前,立即调用。一旦子类知道其视图层次结构已完全创建,这将给子类一个初始化自身的机会。但是,此时片段的视图层次结构尚未附加到其父级。
最好对中的字段分配子视图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);
}
onCreateView用于创建片段的视图层次结构。这可以通过XML膨胀或动态创建(即,以编程方式创建Java视图)来实现。因此,您可能根本不打电话inflate。但是,如果片段需要具有UI元素,则应该返回一些父视图。否则返回null。
FragmentManager和的代码performCreateView,调用onCreateView github.com/android/platform_frameworks_base/blob/…,可以保证onViewCreated生命周期回调有一些
onCreateView返回展开的视图。OnViewCreated之后被调用onCreateView并获取具有膨胀视图的参数。其返回类型为void
getView打来电话
onCreateView()是onCreate()Activity 的Fragment等效项,并在 View创建期间运行。在创建视图后
onViewCreated()运行。
should I use one over the other for performance? NO。没有证据表明性能会提高。
实际上onCreate(),Fragments中也有一种方法,但是很少使用(我从不使用它,也没有找到一个好的用例)。
我总是用onCreateView()Fragments代替onCreate()。
我对此感到满意。
onCreateView这与Activity的等效onCreate。
onCreate()Framents中也有一种方法。但是它从未被使用过(或者至少我从未使用过)。我总是用onCreateView()Fragments作为替换。
Fragment.onCreateView()现在的文档说:
建议仅在此方法中膨胀布局,并将对返回的View进行操作的逻辑移动到onViewCreated(View,Bundle)。
无需我们了解原因;我们只需要按照文档所述进行操作,但是了解为什么存在此建议将很有趣。我最好的猜测是关注点分离,但是恕我直言,这使它比必须的要复杂一些。
setContentView()in中扩大其布局onCreate()?
我认为这之间的主要区别是,当您每次要在xml文件中访问视图时,在onCreateView()中使用kotlin.in时,都应使用findViewById,但在onViewCreated中,只需调用其ID即可访问视图。
onCreateView在片段中用于创建布局和扩大视图。onViewCreated用于引用上述方法创建的视图。最后,在onActivityCreated中定义动作侦听器是一个好习惯。