【发布时间】:2013-11-07 04:17:39
【问题描述】:
尊敬的开发人员,
Fragment 的 onCreate() 方法和 Activity 方法之间的关系对我来说还不是很清楚。我正在将片段附加到这样的活动。
//happens in the Activity:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
FragmentManager fragMan = this.getSupportFragmentManager();
Fragment dataModelFragment = fragMan.findFragmentByTag("data_model");
if (dataModelFragment == null) {
dataModelFragment = new DataModelFragment();
fragMan.beginTransaction().add(dataModelFragment,"data_model").commit();
}
System.out.println("Executing Activity.onCreate()");
}
我的 Fragment 的 onCreate() 有一个 Sysout.println() 用于测试目的,以查看它何时执行。让我感到奇怪的是:为什么 Activity 的 onCreate 会在调用 Fragment 的 onCreate() 之前先完成执行?发生的情况是,上面代码中显示的 Sysout.println 实际上在另一个 Sysout.println 之前执行,它位于我的 Fragment 的 onCreate() 中。我希望在通过片段事务将片段添加到活动之前执行片段的 onCreate()。这是它应该工作的方式吗?还是我在文档中读到的问题是 commit() 方法不会立即执行,而是仅将片段事务放在队列中?
我想要实现的是:
- 我使用 Fragment 的单例实例作为要在活动生命周期中保留的数据模型。
- 我想将此片段添加到活动中,然后让此片段执行其初始化(创建数据库连接并将数据加载到其数据成员中)
- 最后,片段中的这些数据应该与 Activity 视图中的 AdapterView 一起使用。
所以这三个步骤:用数据初始化片段,将片段附加到活动,从片段的数据在活动中创建适配器。我的问题:这些事件应该以哪些方法发生以确保正确的执行顺序?
非常感谢!
【问题讨论】:
-
“为什么 Activity 的 onCreate 是先执行的,为什么 Fragment 的 onCreate() 是后执行的?” - 嗯?您正在
ActivityonCreate(...)方法中创建Fragment。怎么可能反过来呢? -
抱歉,我提出问题的方式可能不够具体。我的问题听起来更正确:如果我从 Activity 的 onCreate() 方法创建 Fragment,为什么完整的 Activity.onCreate() 甚至在调用 Fragment 的 onCreate() 之前完成执行?发生的情况是上面显示的 Sysout.println 实际上在我的另一个 Sysout.println 之前执行,它位于我的 Fragment 的 onCreate 方法中。
-
我怀疑
FragmentTransaction名称中可能存在线索,并且与许多“事务”机制一样,某些方面是异步的。这似乎是一种特别好的方法,因为停止Activity的创建/启动是一个坏主意(可能是 ANR 场景)。根据Fragment在其创建/启动期间需要做什么,它不阻止其“主机”Activity的进度是有意义的。