在使用Google体系结构组件和LiveData
之前,我没有注意onActivityCreated()
回调。
我在SOF和文档中也对此有所了解,但我仍然无法理解其行为。
来自SOF答案之一:
顾名思义,在Activity的onCreate()具有 完成。
在onActivityCreated()
被称为的情况下以及何时onActivityCreated()
未被呼叫?
是否可能onCreateView()
被调用而onActivityCreated()
没有被调用?
在LiveData
中附加onActivityCreated()
个观察者是常见的做法,所以我猜onActivityCreated()
和onCreateView()
之间有很大的不同?
尽管从官方Android文档中查看该图似乎onActivityCreated()
之后onCreateView()
总是被称为总是(就执行而言,不是顺序),并且没有区别吗?
有些令人困惑的地方。
答案 0 :(得分:2)
编辑: :根据Twitter上的Ian Lake(请参阅https://twitter.com/ianhlake/status/1193964829519667202),FragmentActivity
试图分发onActivityCreated
的事实在onStart
中是无关紧要的,因为无论发生什么情况,FragmentManager都会在从onCreate
到onStart
时将其分派。
case Fragment.CREATED: // We want to unconditionally run this anytime we do a moveToState that // moves the Fragment above INITIALIZING, including cases such as when // we move from CREATED => CREATED as part of the case fall through above. if (newState > Fragment.INITIALIZING) { fragmentStateManager.ensureInflatedView(); } if (newState > Fragment.CREATED) { fragmentStateManager.createView(mContainer); fragmentStateManager.activityCreated(); // <-- fragmentStateManager.restoreViewState();
所以我下面所说的实际上是错误的。
显然,在片段内使用onActivityCreated
等效于使用onViewCreated
。
但这也意味着您不应该依靠onActivityCreated
来了解您的Activity是否真正创建,因为它比实际创建Activity的次数要多。
片段令人困惑。
原始答案:
是否可以调用onCreateView()但不调用onActivityCreated()?
更新:否,不可能。
原始:是的,他们在FragmentPagerAdapter
中使用FragmentTransaction.detach
/ FragmentTransaction.attach
,这会导致视图被破坏,但片段仍然存在(已停止) ,但未销毁。)
在这种情况下,.attach()
运行onCreateView
,而不运行onActivityCreated
。
在onActivityCreated()中附加LiveData观察者是一种常见的做法,所以我猜onActivityCreated()和onCreateView()之间有显着差异?
更新:没关系,尽管onViewCreated
仍然更清楚。
原始:这实际上是 不良习惯 ,应在onViewCreated
中完成,并提供getViewLifecycleOwner()
作为生命周期所有者。
尽管从Android官方文档中查看该图似乎好像onActivityCreated()总是在onCreateView()之后调用,并且没有区别?
更新:尽管FragmentActivity
仅尝试调度一次,但是所有Fragment始终都要经过onActivityCreated
,因为FragmentManager就是这样工作的。
原始:它并不总是在onCreateView
之后被调用,实际上,它更多地被称为“在onStart
之前,但仅一次”。
/** * Dispatch onStart() to all fragments. */ @Override protected void onStart() { super.onStart(); mStopped = false; if (!mCreated) { mCreated = true; mFragments.dispatchActivityCreated(); // <--- } mFragments.noteStateNotSaved(); mFragments.execPendingActions(); // NOTE: HC onStart goes here. mFragments.dispatchStart(); }
更新:但是显然,这对FragmentManager来说并不重要,因为它以两种方式都CREATED -> ACTIVITY_CREATED -> STARTED
进入。