将活动中的对象传递给片段

我有一个使用FragmentActivity 。 我只是想将这个Activity一个对象传递给Fragment

我怎么能这样做? 到目前为止我所见过的所有教程都从资源中检索数据。

编辑:

让我们更精确一点:

我的活动在左边部分有一个ListView 。 当你点击它的时候,想法是在右边加载一个Fragment

当我input这个Activity ,通过Intent给出一个Object Category 。 该对象包含其他对象Questions列表(其中包含string列表)。 这些Questions对象显示在ListView上。 当我从ListView单击一个项目时,我想显示String列表到Fragment (到一个ListView )。

为此,我使用布局从Activity调用setContentView() 。 在这个布局中定义了带有正确类的Fragment来调用。 当我调用这个setContentView() ,我的FragmentonCreateView()被调用,但在这个时候, getArguments()返回null。

onCreateView()的调用之前,我如何设法填充它? (告诉我,如果我不够清楚)

谢谢

Fragment创build一个静态方法,然后使用getArguments()来获取它。

例:

 public class CommentsFragment extends Fragment { private static final String DESCRIBABLE_KEY = "describable_key"; private Describable mDescribable; public static CommentsFragment newInstance(Describable describable) { CommentsFragment fragment = new CommentsFragment(); Bundle bundle = new Bundle(); bundle.putSerializable(DESCRIBABLE_KEY, describable); fragment.setArguments(bundle); return fragment; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mDescribable = (Describable) getArguments().getSerializable( DESCRIBABLE_KEY); // The rest of your code } 

你可以从Activity调用它,像这样做:

 FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); Fragment fragment = CommentsFragment.newInstance(mDescribable); ft.replace(R.id.comments_fragment, fragment); ft.commit(); 

你应该在你的片段中创build一个方法,接受你想要传入的对象的types。 在这种情况下,我把它命名为“setObject”(creative huh?:))那么这个方法可以执行你需要的那个对象的任何操作。

 MyFragment fragment; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) { fragment = new MyFragment(); getSupportFragmentManager().beginTransaction().add(android.R.id.content, detailsFragment) .commit(); } else { fragment = (MyFragment) getSupportFragmentManager().findFragmentById( android.R.id.content); } fragment.setObject(yourObject); //create a method like this in your class "MyFragment" } 

请注意,我正在使用支持库和调用getSupportFragmentManager()可能只是getFragmentManager()为你取决于你正在工作

在你的活动课上:

 public class BasicActivity extends Activity { private ComplexObject co; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_page); co=new ComplexObject(); getIntent().putExtra("complexObject", co); FragmentManager fragmentManager = getFragmentManager(); Fragment1 f1 = new Fragment1(); fragmentManager.beginTransaction() .replace(R.id.frameLayout, f1).commit(); } 

注意:你的对象应该实现Serializable接口

然后在你的片段中:

 public class Fragment1 extends Fragment { ComplexObject co; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Intent i = getActivity().getIntent(); co = (ComplexObject) i.getSerializableExtra("complexObject"); View view = inflater.inflate(R.layout.test_page, container, false); TextView textView = (TextView) view.findViewById(R.id.DENEME); textView.setText(co.getName()); return view; } } 

按束传递参数仅限于某些数据types。 但是你可以通过这种方式将任何数据传送给你的片段:

在你的片段中创build一个像这样的公共方法

 public void passData(Context context, List<LexItem> list, int pos) { mContext = context; mLexItemList = list; mIndex = pos; } 

并在你的活动中实例化片段后调用passData()和所有你需要的数据types

  WebViewFragment myFragment = new WebViewFragment(); myFragment.passData(getApplicationContext(), mLexItemList, index); FragmentManager fm = getSupportFragmentManager(); FragmentTransaction ft = fm.beginTransaction(); ft.add(R.id.my_fragment_container, myFragment); ft.addToBackStack(null); ft.commit(); 

备注:我的片段扩展了“android.support.v4.app.Fragment”,因此我必须使用“getSupportFragmentManager()”。 当然,这个原则也适用于一个扩展了“Fragment”的片段类,但是你必须使用“getFragmentManager()”。