正确的方法来给碎片初始数据?

所以我知道我需要一个空的构造函数,以便我的碎片不会在重新初始化时崩溃。 我的问题是,我的碎片初始化时(至less其中一些)使用数据列表。 那么用一个数据列表开始新的片段是一个好方法。 我应该在OnCreate()做一个getData方法,从其他来源获取数据或什么是一个合适的方法?

用数据喂食包真的不是一个很好的方法,因为我有很多数据。

所以让我们来看一个案例(我理解这种方式更好)。

当用户点击一个button时,片段被启动。 我以前做的是用这种方式创build一个新的片段:

FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.center_container, new DetailFragment(item)); fragmentTransaction.addToBackStack(DETAIL_TAG); fragmentTransaction.commit(); 

然后在我的片段:

 public DetailFragment(EventItem item) { mItem = item; mPlaces = Database.getContainerPlaces(getActivity()).getValidItems(); } 

我不能把所有的数据都提供给一个bundle,所以这是行不通的。 所以我该怎么做?

答:我应该使用空构造函数初始化片段,然后从我的活动中使用setter直接在片段中设置数据? 但是,如果用户按下home,android会closures片段,并且用户稍后返回,那么是不是会丢失数据?

B:我应该用工厂模式初始化片段并调用setRetainInstance(true),给片段一个用于标识数据的关键字,然后让片段从第三个源获取onCreateView中所需的数据?

C:我应该只是做一个空的构造函数,然后在onCreate()获取片段所需的数据?

应该指出的是,应用程序被locking在肖像,所以这个问题主要是在Androidclosures和用户重新启动时维护对象。

那么用一个数据列表开始新的片段是一个好方法。

使用工厂模式和“参数” Bundle ,如:

 package com.commonsware.empublite; import android.os.Bundle; public class SimpleContentFragment extends AbstractContentFragment { private static final String KEY_FILE="file"; protected static SimpleContentFragment newInstance(String file) { SimpleContentFragment f=new SimpleContentFragment(); Bundle args=new Bundle(); args.putString(KEY_FILE, file); f.setArguments(args); return(f); } @Override String getPage() { return(getArguments().getString(KEY_FILE)); } } 

如果你保留你的片段实例,那么你应该能够使用普通的setter来把东西放入数据成员中。 “参数” Bundle被保留作为configuration更改的一部分,所以对于非保留实例,这是确保您的设置数据在用户旋转屏幕时保留的方式等。