107

对于活动,我曾经这样做:

在活动 1 中:

Intent i = new Intent(getApplicationContext(), MyFragmentActivity.class);
                i.putExtra("name", items.get(arg2));
                i.putExtra("category", Category);
                startActivity(i);

在活动 2 中:

Item = getIntent().getExtras().getString("name");

你如何使用 Fragments 做到这一点?我也在使用兼容性库 v4。

它在 FragmentActivity 中吗?还是实际的片段?它采用哪种方法?创建?创建视图?其他?

我可以看看示例代码吗?

编辑:值得注意的是,我试图将 Activity 1 保留为 Activity(或者实际上是 ListActivity,我在单击时传递了 listitem 的意图),然后传递给一组选项卡式片段(通过片段 Activity)和我需要任一选项卡才能获得附加功能。(我希望这是可能的吗?)

4

2 回答 2

174

你仍然可以使用

String Item = getIntent().getExtras().getString("name");

在 中fragment,您只需getActivity()要先调用:

String Item = getActivity().getIntent().getExtras().getString("name");

这可以节省您编写一些代码的时间。

于 2013-02-07T08:31:57.103 回答
111

我倾向于做的事情,而且我相信这也是 Google 打算让开发人员做的事情,仍然是从Intentin 中获取额外的Activity数据,然后通过使用参数实例化它们将任何额外的数据传递给片段。

实际上,在 Android 开发博客上有一个示例说明了这个概念,您也会在几个 API 演示中看到这一点。尽管此特定示例是针对 API 3.0+ 片段给出的,但在使用FragmentActivityFragment来自支持库时也适用相同的流程。

您首先像往常一样在活动中检索意图附加内容,并将它们作为参数传递给片段:

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的例子中经常调用这种方法。实际上有一个方法,所以我不确定为什么上面的代码片段中没有使用它......newInstanceDetailsFragment

无论如何,在创建片段时作为参数提供的所有额外内容都可以通过调用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)

}
于 2012-07-09T00:42:47.697 回答