重新加载 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

关于Fragment的懒加载问题

从 Fragment 返回时,Flow onEach/collect 被多次调用

多次重新加载 TableView Swift

在通知单击时启动 Fragment 而不会丢失状态

重新加载片段不起作用