我通常会这样做,我相信这也是Google希望开发者这样做的。我会在Activity
中获取Intent
的额外数据,然后通过为片段实例化参数来传递任何额外数据。
实际上,在Android开发博客上有一个示例,阐述了这个概念,你也会在一些API演示中看到这个概念。虽然这个具体示例是针对API 3.0+ 片段给出的,但使用支持库中的FragmentActivity
和Fragment
时,同样适用此流程。
你首先像平常一样在活动中检索意图的额外数据,并将它们作为参数传递给片段:
public static class DetailsActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState == null) {
DetailsFragment details = new DetailsFragment();
details.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(
android.R.id.content, details).commit();
}
}
}
不要直接调用构造函数,使用一个静态方法将参数插入片段中可能更容易。在Google给出的示例中,这样的方法通常被称为newInstance
。实际上,在DetailsFragment
中有一个newInstance
方法,因此我不确定为什么上面的代码片段没有使用它...
无论如何,创建片段时提供的所有额外信息都可以通过调用getArguments()
来获取。由于它返回一个Bundle
,所以其使用方式类似于Activity
中的extras。
public static class DetailsFragment extends Fragment {
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
public int getShownIndex() {
return getArguments().getInt("index", 0);
}
}