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

The*_*ter 101 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);
Run Code Online (Sandbox Code Playgroud)

在活动2中:

Item = getIntent().getExtras().getString("name");
Run Code Online (Sandbox Code Playgroud)

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

它是否属于FragmentActivity?还是实际的碎片?它采用哪种方法?的onCreate?onCreateView?另一个?

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

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

mee*_*eee 168

你仍然可以使用

String Item = getIntent().getExtras().getString("name");
Run Code Online (Sandbox Code Playgroud)

fragment,你只需getActivity()要先打电话:

String Item = getActivity().getIntent().getExtras().getString("name");
Run Code Online (Sandbox Code Playgroud)

这样可以节省您编写代码的麻烦.

  • 这可能是一个简单的解决方案,但这不是一个好习惯.这样做的原因是它在Fragment和Activity之间产生了强烈的依赖关系.这样做的主要缺点是1)Fragment变得不可重用(至少不会对使用它的任何Activity引入额外的约束).2)它对Fragment的使用产生了一个非显而易见的软性要求(不清楚使用该片段是否要求传递给它的Activity的任何意图都有特定的Intent条目).至少要知道传递数据和做出明智决定的正确方法. (50认同)
  • @zeeshan简单或优雅.更像是耦合和复杂性 (8认同)
  • 这是错误的方法,在某些情况下不起作用.片段的生命周期与活动的生命周期没有很强的联系,因此您可以调用null调用getActivity().它只在fragment的onCreate和其他一些回调中安全 (7认同)
  • 一种简单而优雅的方法来检索意图数据. (2认同)

MH.*_*MH. 108

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

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

您首先在活动中检索intent intent,并将它们作为参数传递给片段:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

而不是直接调用构造函数,使用静态方法可能更容易,该方法将参数插入到片段中.这种方法通常newInstanceGoogle给出示例中调用.实际上有一种newInstance方法DetailsFragment,所以我不确定为什么它没有在上面的代码段中使用...

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

}
Run Code Online (Sandbox Code Playgroud)

  • 当您使用XML指定片段而不是使用事务管理器时,有没有办法实现此目的? (2认同)
  • @JimG.是的,因为平台依赖于非参数化构造函数来动态(重新)创建`Fragment`实例.这里有几个相关的问答,你可能会发现[这一个](http://stackoverflow.com/questions/14654766/creating-a-fragment-constructor-vs-newinstance)有助于阅读. (2认同)