替换未调用 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 等的活动中的片段的主要内容,如果未能解决你的问题,请参考以下文章
onAttach(Context context) 没有被调用
在 onActivityCreated() 之后再次调用 Fragment 的 onAttach()