FragmentTransaction.commit()后不立即调用onCreateView()

时间:2012-06-02 18:06:04

标签: android design-patterns android-fragments

我有一个动态替换片段的活动:

private void goToFragment(Fragment newFragment, String tag) {
    FragmentTransaction ft = getFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, tag);
    ft.addToBackStack(null);
    ft.commit();
}

现在,我想访问片段中的视图,以便在调用goToFragment后立即将数据(我已存储在我的活动中)放入其中。

问题是,片段的onCreateView在片段完全呈现之前没有被调用,至少在我理解之前。

我知道覆盖片段中的onAttach(Activity activity)是一种方法,但我必须将它专门用于我的活动 - 而我只是想避免这种情况,因为我认为这是不好的做法片段依赖于特定的活动。

据我所见,Fragment没有实施任何听众(作为主题)。

所以我想我必须自己创建一个监听器(使用Observer Pattern使片段成为主题,活动成为观察者),然后在onCreateView或{{1}时调用它完成后,最后用需要设置的数据回调片段。但是,我需要为几个片段执行此操作,因此我必须为每个片段创建一个侦听器,我再次认为这是不好的。

有没有更好/更简单的方法呢?

3 个答案:

答案 0 :(得分:37)

致电FragmentTransaction后,

commit()不会立即应用。您可以手动强制更新:

...
mFragmentManager.executePendingTransactions();

AFAIK事件回调的目的是与Fragment进行自定义通信,超出通常的生命周期。

答案 1 :(得分:4)

正确的方法是为Activity类定义一个接口,希望显示您的Fragment应该实现的类。这样,在onAttach上,您不会转发到特定的Activity,而是转发到您的界面。

例如参见:http://developer.android.com/guide/topics/fundamentals/fragments.html#EventCallbacks

答案 2 :(得分:2)

您应该使用onActivityCreated来设置值。

onCreateView中设置引用,然后在onActivityCreated中为其设置值。