替换未调用 onAttach、onCreate、onCreateView 等的活动中的片段

Posted

技术标签:

【中文标题】替换未调用 onAttach、onCreate、onCreateView 等的活动中的片段【英文标题】:Replacing fragments in an activity not calling onAttach, onCreate, onCreateView, etc 【发布时间】:2014-09-17 07:49:41 【问题描述】:

所以我在这里有这段代码,我正在创建一个新的片段并用另一个片段替换它。效果很好。但是我注意到在第一行调用了构造函数,但没有调用onAttach()onCreate() 等。如果我取消注释第二行,它将不起作用,因为 updateItem(URL) 需要在 onCreate() 函数中启动的 webView。

DetailViewFragment detailFragment = new DetailViewFragment();
//detailFragment.updateItem(URL);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.displayList, detailFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();

如果有任何帮助可以使它与未注释的第二行一起工作,我们将不胜感激。

【问题讨论】:

我相信在片段被提交给 Activity 之前不会调用 onAttach、onCreate 等。所以应该在该代码的最后一行调用它们。关于生命周期的 android 文档:developer.android.com/reference/android/app/… 您是否尝试过使用 ft.add(...)? 【参考方案1】:

FragmentManager 实际提交更改之前,不会调用onAttach()onCreate() 等。因此,在转换调用 commit() 之后的一段时间。如果您需要从一开始就将 URL 传递给 Fragment,请将其添加到您调用 commit() 的片段的参数包之前。然后,您将能够访问您的 onCreate() 或其他生命周期方法中的 URL。所以你会想要这样的东西:

DetailViewFragment detailFragment = new DetailViewFragment();
Bundle args = new Bundle();
args.putString(DetailViewFragment.INIT_URL, URL);
detailFragment.setArguments(args);
ft.replace(R.id.displayList, detailFragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack(null);
ft.commit();

现在,在您的 onCreate() 中,您可以调用 getArguments() 来获取捆绑包并检索您的活动传递的 URL。

【讨论】:

【参考方案2】:

API 级别 23 onAttach(Context context) 有效 API 级别 22 onAttach(Activity activity) 有效

实现这两种方法都对我有用:

@Override
public void onAttach(Context context) 
    super.onAttach(context);


@Override
public void onAttach(Activity activity) 
    super.onAttach(activity);

【讨论】:

【参考方案3】:

另一种解决方案是在提交之后调用getSupportFragmentManager().executePendingTransactions();。请注意,交易将是同步的。

【讨论】:

以上是关于替换未调用 onAttach、onCreate、onCreateView 等的活动中的片段的主要内容,如果未能解决你的问题,请参考以下文章

Fragment生命周期

onAttach(Context context) 没有被调用

在 onActivityCreated() 之后再次调用 Fragment 的 onAttach()

Android setContentView()源码解析

Fragment的public void onAttach(Context context) 没有被调用的问题

Fragment的public void onAttach(Context context) 没有被调用的问题