这两种方法之间的本质区别是什么?创建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
但不应使用findViewById
in 初始化其他视图onCreateView
。
因为有时视图没有正确初始化。因此,请始终使用findViewById
in onViewCreated
(当完全创建视图时),并且还会将视图作为参数传递。
onViewCreated
确保已完全创建视图。
onViewCreated android文档
在onCreateView
(android.view.LayoutInflater, android.view.ViewGroup
,android.os.Bundle
)返回之后,但尚未将任何保存状态恢复到视图中之前立即调用。一旦子类知道其视图层次结构已完全创建,这将给子类一个初始化自身的机会。但是,此时片段的视图层次结构尚未附加到其父级。
post
(...)方法等待显示。可能会在中进行findViewById和其他初始化onViewCreated
。
onViewCreated
onCreateView
(您初始化并创建所有对象(包括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中定义动作侦听器是一个好习惯。