2

使用包含 Button id=button In 的 Fragment 创建应用程序

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

    }

onCreateViewb 作为按钮返回,并且在方法结束之前调用片段。但在

@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);
}

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

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

4

1 回答 1

1

老实说,我很惊讶第一个有效。

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

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

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

于 2017-01-10T18:01:21.627 回答