使用包含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(或任何其他事件处理程序)?
答案 0 :(得分:0)
我真的很惊讶第一个工作。
如果我必须下注,FragmentManager
不会调用Fragment生命周期回调超出活动当前生命周期的点。从onCreate()
开始,它会在片段上调用onAttach()
然后调用onCreate()
。在onCreate
和onStart
之间的某个时刻,FragmentManager将通过在到目前为止提交的每个Fragment上调用onCreateView()
来完成布局过程。然后,当Activity开始时,它会在每个片段上调用onStart()
。
如果您要在稍后的回调中提交片段,比如onResume()
。 FragmentManager需要将Fragment设置为一直到某一点,因此它将在生命周期onAttach()
,onCreate()
,onCreateView()
,{ {1}},onViewCreated()
,最后是onStart()
。现在片段将被活动的其余部分捕获。
一般来说,通常没有理由让Activity直接访问onResume()
内部View元素。 Fragment处理视图事件。如有必要,将事件传递回活动。这允许您根据需要更改Fragment的布局,而无需修改Activity。它还允许您在不同的活动中重复使用片段。