【问题标题】:Relationship between Fragment.onCreate() and Activity.onCreate()Fragment.onCreate() 和 Activity.onCreate() 的关系
【发布时间】: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() 是后执行的?” - 嗯?您正在 Activity onCreate(...) 方法中创建 Fragment。怎么可能反过来呢?
  • 抱歉,我提出问题的方式可能不够具体。我的问题听起来更正确:如果我从 Activity 的 onCreate() 方法创建 Fragment,为什么完整的 Activity.onCreate() 甚至在调用 Fragment 的 onCreate() 之前完成执行?发生的情况是上面显示的 Sysout.println 实际上在我的另一个 Sysout.println 之前执行,它位于我的 Fragment 的 onCreate 方法中。
  • 我怀疑FragmentTransaction 名称中可能存在线索,并且与许多“事务”机制一样,某些方面是异步的。这似乎是一种特别好的方法,因为停止 Activity 的创建/启动是一个坏主意(可能是 ANR 场景)。根据Fragment 在其创建/启动期间需要做什么,它不阻止其“主机”Activity 的进度是有意义的。

标签: android android-fragments


【解决方案1】:

来自安卓FragmentTransaction.Commit()docs

安排此事务的提交。提交没有发生 立即地;它将被安排在主线程上工作 下次该线程准备好时完成。

如果您希望立即处理您的交易,请从您的 UI 线程调用 FragmentManager.ExecutePendingTransactions()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-16
    • 2011-10-25
    • 2021-10-19
    • 2013-03-27
    • 1970-01-01
    相关资源
    最近更新 更多