Android CommitNow不从onCreate调用onCreateView

时间:2017-01-10 17:31:11

标签: android android-fragments oncreate fragment-oncreateview

使用包含Button id =按钮的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。 这可能是一个“功能”,但文档中没有任何内容。

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

1 个答案:

答案 0 :(得分:0)

我真的很惊讶第一个工作。

如果我必须下注,FragmentManager不会调用Fragment生命周期回调超出活动当前生命周期的点。从onCreate()开始,它会在片段上调用onAttach()然后调用onCreate()。在onCreateonStart之间的某个时刻,FragmentManager将通过在到目前为止提交的每个Fragment上调用onCreateView()来完成布局过程。然后,当Activity开始时,它会在每个片段上调用onStart()

如果您要在稍后的回调中提交片段,比如onResume()。 FragmentManager需要将Fragment设置为一直到某一点,因此它将在生命周期onAttach()onCreate()onCreateView(),{ {1}},onViewCreated(),最后是onStart()。现在片段将被活动的其余部分捕获。

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