Android片段中的getIntent()。getExtras()在哪里/如何?

时间:2012-07-09 00:07:11

标签: android android-intent android-fragments android-activity

通过活动,我曾经这样做过:

在活动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?还是实际的碎片? 它采用哪种方法?的onCreate? onCreateView?另一?

我可以看一下示例代码吗?

编辑:值得注意的是我试图将Activity 1保留为Activity(或实际上是ListActivity,我点击时传递listitem的意图),然后传递给一组tabbed-fragments(通过Fragment Activity) )我需要任何一个标签才能获得额外的东西。 (我希望这可能吗?)

2 个答案:

答案 0 :(得分:168)

你仍然可以使用

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

,您只需先致电getActivity()

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

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

答案 1 :(得分:108)

我倾向于做的,我相信这也是Google打算让开发人员做的事情,就是仍然可以从Intent中的Activity获取额外内容,然后将任何额外数据传递给片段通过参数实例化。

在Android开发博客上实际上有an example来说明这个概念,你也会在几个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();
        }
    }
}

代替直接调用构造函数,可能更容易使用将参数插入到片段中的静态方法。这种方法通常在examples given by Google中称为newInstance。实际上newInstance中有一个DetailsFragment方法,所以我不确定为什么它不会在上面的代码段中使用...

无论如何,通过调用getArguments()可以获得在创建片段时作为参数提供的所有额外内容。由于这会返回Bundle,因此其用法类似于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)

}