Android CommitNow在onCreate中不调用onCreateView方法

3

使用一个包含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为空并且在方法结束之前不会调用onCreateView。这可能是一种“特性”,但文档中没有任何相关说明。
为什么在onCreate中commitNow的行为与在onStart(或任何其他事件处理程序)中不同,后者会同步地调用onCreateView
1个回答

1

我很惊讶第一个代码能够工作。

如果我要打赌,那就是 FragmentManager 在 Activity 的当前生命周期之后不会调用 Fragment 生命周期回调函数。从 onCreate() 开始,它会在 Fragment 上调用 onAttach() 然后调用 onCreate()。在 onCreateonStart 之间的某个时刻,FragmentManager 将通过调用已提交的每个 Fragment 上的 onCreateView() 完成布局流程。然后,当 Activity 启动时,它会在每个 Fragment 上调用 onStart()

如果您在稍后的回调中提交 Fragment,比如 onResume(),FragmentManager 将需要设置 Fragment 直到该点,因此它将一次性按顺序执行整个生命周期:onAttach()onCreate()onCreateView()onViewCreated()onStart(),最后是 onResume()。现在,Fragment 将与 Activity 的其余部分保持同步。

一般来说,Activity通常无需直接访问Fragment的内部View元素。Fragment处理视图事件。必要时,将事件传递回Activity。这使您可以随意更改Fragment的布局,而无需修改Activity。它还允许您在不同的Activity中重复使用Fragment。


这是一个有趣的想法,关于Activity和Fragment生命周期如何配合的文档并不清晰。然而,如果你使用<fragment>标签来包含一个Fragment,那么在Activity的OnCreate方法中,FragmentManager确实会调用onCreateView方法。 我会尽力找到更多关于这两个生命周期如何同步的信息。 - undefined
@MikeJames 我发现最好根本不将这两个生命周期关联在一起。例如,当使用ViewPager时,Fragment的生命周期变得非常复杂。把它们看作是两个独立的实体。 - undefined
我可以看到,在设计Fragment时忽略Activity和Fragment生命周期之间的同步是一种简化,但在这种情况下,有人建议了解发生的事情是至关重要的。假设是Activity不会在时间上“推动”Fragment的状态超过自然状态。仍在努力弄清楚如何确定是否确实发生了这种情况。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接