【问题标题】:Android CommitNow Does Not call onCreateView from onCreateAndroid CommitNow 不会从 onCreate 调用 onCreateView
【发布时间】:2017-01-10 17:31:10
【问题描述】:

使用包含 Button id=button 的 Fragment 创建应用 在

  @Override
    protected void onStart() {
        super.onStart();
        getSupportFragmentManager()
                .beginTransaction()
                .add(R.id.activity_main, new Testfrag())
                .commitNow();
        View b = findViewById(R.id.button);

    }

b 作为按钮返回,片段onCreateView 在方法结束之前被调用。 但是在

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
 FragmentManager fm=  getSupportFragmentManager();
       fm.beginTransaction()
          .add(R.id.activity_main, new Testfrag())
        .commitNow();
   View b = findViewById(R.id.button);
}

b 为 null,直到方法结束后才会调用片段 onCreateView。 这可能是一个“功能”,但文档中没有任何内容。

为什么 commit Now 在 onCreate 中表现不同 - 直到稍后才调用 onCreateView 和同步调用 onCreateView 的 onStart(或任何其他事件处理程序)?

【问题讨论】:

    标签: android android-fragments oncreate fragment-oncreateview


    【解决方案1】:

    我真的很惊讶第一个有效。

    如果我不得不下注,那就是FragmentManager 不会在 Activity 当前生命周期的点之外调用 Fragment 生命周期回调。从onCreate() 它将在片段上调用onAttach() 然后onCreate()。在onCreateonStart 之间的某个时间点,FragmentManager 将通过在迄今为止已提交的每个 Fragment 上调用 onCreateView() 来完成布局过程。然后它会在 Activity 启动时在每个 Fragment 上调用onStart()

    如果您要在稍后的回调中提交 Fragment,例如 onResume()。 FragmentManager 将需要一直设置 Fragment 到某个特定点,因此它将沿着生命周期 onAttach()onCreate()onCreateView()onViewCreated()onStart(),最后是 @ 987654335@ 一次。现在 Fragment 将被 Activity 的其余部分赶上。

    一般来说,Activity 通常没有理由直接访问 Fragment's 内部视图元素。 Fragment 处理视图事件。如有必要,将事件传递回活动。这使您可以根据需要更改 Fragment 的布局,而无需修改 Activity。它还允许您在不同的活动中重复使用片段。

    【讨论】:

    • 这是一个有趣的想法,关于 Activity 和 Fragment 生命周期如何组合在一起的文档尚不清楚。但是,如果您使用 标记包含 Fragment,那么 FragmentManager 会在 Activity OnCreate 中调用 onCreateView。我会看看我是否能找到更多关于这两个生命周期如何同步的信息。
    • @MikeJames 我发现最好不要将这两个生命周期链接在一起。例如,当使用 ViewPager 时,片段的生命周期变得非常复杂。将它们视为两个独立的实体。
    • 我可以看到,当您考虑设计 Fragment 时,忽略 Activity 和 Fragment 生命周期之间的任何同步是一种简化,但在这种情况下,有人建议了解正在发生的事情至关重要。假设是 Activity 不会将 Fragment 的状态“推”得比当时自然的更远。仍在尝试弄清楚如何查看这是否确实发生了。
    猜你喜欢
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 1970-01-01
    • 2015-07-12
    • 1970-01-01
    • 2018-12-02
    相关资源
    最近更新 更多