16

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

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没有实现任何听众(作为主题)。

所以我想我必须创建自己的侦听器(使用观察者模式使片段成为主题,活动成为观察者),然后在onCreateVieworonAttach完成时调用它,然后最后用数据回调到片段需要设置。但是,我需要对几个片段执行此操作,因此我必须为每个片段创建一个侦听器,我再次认为这很糟糕。

有没有更好/更简单的方法来做到这一点?

4

3 回答 3

37

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

...
mFragmentManager.executePendingTransactions();

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

于 2012-06-02T20:03:09.203 回答
4

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

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

于 2012-06-02T18:09:53.573 回答
2

您应该使用onActivityCreated来设置值。

在 中设置引用,onCreateView然后在 中为它们设置值onActivityCreated

于 2012-06-02T18:18:38.830 回答