重新加载 Fragment 时多次调用 Fragment onCreate
Posted
技术标签:
【中文标题】重新加载 Fragment 时多次调用 Fragment onCreate【英文标题】:Fragment onCreate called multiple times when reload the Fragment 【发布时间】:2014-02-20 20:10:42 【问题描述】:下面是我的代码:
public class MyListFragmentActivity extends FragmentActivity
@Override
public void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
System.out.println("DEBUG : MLFA onCreate");
if (savedInstanceState == null)
getSupportFragmentManager().beginTransaction().replace(fragmentID, new MyListFragment())
.replace(detailFragmentID, new MyDetailFragment()).commit();
@Override
protected void onRestart()
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
Fragment prevFrag = getSupportFragmentManager().findFragmentById(detailFragmentID);
if (prevFrag != null)
fragmentTransaction.remove(prevFrag);
getSupportFragmentManager().beginTransaction().replace(detailFragmentID, new MyDetailFragment()).commitAllowingStateLoss();
else
getSupportFragmentManager().beginTransaction().replace(detailFragmentID, new MyDetailFragment()).commitAllowingStateLoss();
MyListFragment
public class MyListFragment extends Fragment
//When we click on each item in list view call detail fragment to relad its layout
OnItemClickListener onItemClickListener = new OnItemClickListener()
/** Getting the fragmenttransaction object, which can be used to add, remove or replace a fragment */
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
/** Getting the existing detailed fragment object, if it already exists.
* The fragment object is retrieved by its tag name
* */
Fragment prevFrag = getFragmentManager().findFragmentById(detailFragmentID);
/** Remove the existing detailed fragment object if it exists */
if (prevFrag != null)
fragmentTransaction.remove(prevFrag);
MyDetailFragment mydetailFragment = new MyDetailFragment();
fragmentTransaction.replace(detailFragmentID, mydetailFragment);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.show(getFragmentManager().findFragmentById(detailFragmentID));
fragmentTransaction.commit();
MyDetailFragment
public class MyDetailFragment extends Fragment
onCreate() // on create being called multiple times ? why ?????????????
onCreateView()
当我点击我的列表项时,MyDetailFragment onCreate() 只被调用一次,但是当我将设备倾斜到纵向或横向时,MyDetailFragment onCreate() 会被调用多次?
为什么会这样?我在这里做错了什么以及如何解决这个问题?
【问题讨论】:
【参考方案1】:每次更改方向时,都与重新启动应用程序一样好。您需要适当地处理更改,例如释放资源、再次获取它们、停止您正在进行的任何工作并恢复它们等等。
你没有做错什么。
【讨论】:
在我的情况下如何解决?它只是调用 MyDetailFragment 的 onCreate 方法 查看生命周期并根据需要进行更改:developer.android.com/reference/android/app/… =) 我的行为与他们在生命周期中所展示的完全一样?但仍然为什么 oncreate 被一次又一次地调用? 你在添加和删除片段吗? 是现成的代码吗?我猜你正在替换碎片,这就是它的原因fragmentTransaction.replace(detailFragmentID, mydetailFragment);
以上是关于重新加载 Fragment 时多次调用 Fragment onCreate的主要内容,如果未能解决你的问题,请参考以下文章
FragmentTabHost切换Fragment避免重新加载Fragment,即重复调用Fragment的onCreateView