将活动中的对象传递给片段
我有一个使用Fragment
的Activity
。 我只是想将这个Activity
一个对象传递给Fragment
。
我怎么能这样做? 到目前为止我所见过的所有教程都从资源中检索数据。
编辑:
让我们更精确一点:
我的活动在左边部分有一个ListView
。 当你点击它的时候,想法是在右边加载一个Fragment
。
当我input这个Activity
,通过Intent
给出一个Object Category
。 该对象包含其他对象Questions
列表(其中包含string列表)。 这些Questions
对象显示在ListView上。 当我从ListView
单击一个项目时,我想显示String
列表到Fragment
(到一个ListView
)。
为此,我使用布局从Activity
调用setContentView()
。 在这个布局中定义了带有正确类的Fragment
来调用。 当我调用这个setContentView()
,我的Fragment
的onCreateView()
被调用,但在这个时候, 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()”。