我倾向于做的事情,而且我相信这也是 Google 打算让开发人员做的事情,仍然是从Intent
in 中获取额外的Activity
数据,然后通过使用参数实例化它们将任何额外的数据传递给片段。
实际上,在 Android 开发博客上有一个示例说明了这个概念,您也会在几个 API 演示中看到这一点。尽管此特定示例是针对 API 3.0+ 片段给出的,但在使用FragmentActivity
和Fragment
来自支持库时也适用相同的流程。
您首先像往常一样在活动中检索意图附加内容,并将它们作为参数传递给片段:
public static class DetailsActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// (omitted some other stuff)
if (savedInstanceState == null) {
// During initial setup, plug in the details fragment.
DetailsFragment details = new DetailsFragment();
details.setArguments(getIntent().getExtras());
getSupportFragmentManager().beginTransaction().add(
android.R.id.content, details).commit();
}
}
}
与其直接调用构造函数,不如使用静态方法为您将参数插入片段中可能更容易。谷歌给出newInstance
的例子中经常调用这种方法。实际上有一个方法,所以我不确定为什么上面的代码片段中没有使用它......newInstance
DetailsFragment
无论如何,在创建片段时作为参数提供的所有额外内容都可以通过调用getArguments()
. 由于这会返回 a Bundle
,因此其用法类似于 an 中的 extras Activity
。
public static class DetailsFragment extends Fragment {
/**
* Create a new instance of DetailsFragment, initialized to
* show the text at 'index'.
*/
public static DetailsFragment newInstance(int index) {
DetailsFragment f = new DetailsFragment();
// Supply index input as an argument.
Bundle args = new Bundle();
args.putInt("index", index);
f.setArguments(args);
return f;
}
public int getShownIndex() {
return getArguments().getInt("index", 0);
}
// (other stuff omitted)
}