【问题标题】:Where/How to getIntent().getExtras() in an Android Fragment? [duplicate]在哪里/如何在 Android 片段中获取 Intent().getExtras()? [复制]
【发布时间】:2012-07-08 10:04:42
【问题描述】:

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

在活动 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,我在单击时传递列表项的意图),然后传递给一组选项卡式片段(通过片段 Activity ) 并且我需要任一选项卡才能获得附加功能。 (我希望这是可能的?)

【问题讨论】:

  • 这可能是重复的,但人们似乎更喜欢这个问题。我只是说。
  • 以前没有人问过这个问题

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


【解决方案1】:

你仍然可以使用

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

fragment,你只需要先调用getActivity()

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

这样你就不必编写一些代码了。

【讨论】:

  • 这样可以节省大量的代码编写!好一个:)
  • 一种简单而优雅的检索意图数据的方法。
  • @zeeshan 既不简单也不优雅。更像是耦合和复杂性
  • 这可能是一个简单的解决方案,但这不是一个好的做法。这样做的原因是因为它在 Fragment 和 Activity 之间创建了很强的依赖关系。这样做的主要缺点是 1) Fragment 变得不可重用(至少没有对任何使用它的 Activity 引入额外的约束)。 2)它对片段的使用创建了一个不明显的软要求(不清楚使用片段是否需要传递给它的活动的任何意图都有特定的意图条目)。至少要知道传递数据的正确方式并做出明智的决定。
  • 这是错误的方法,在某些情况下不起作用。片段的生命周期与活动的生命周期没有紧密的联系,因此您可以通过调用 getActivity() 获得 null。仅在片段的 onCreate 和其他一些回调中是安全的
【解决方案2】:

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

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

您首先像往常一样在 Activity 中检索 Intent Extras,并将它们作为参数传递给片段:

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 中通常称为newInstanceDetailsFragment中其实有一个newInstance方法,所以我不确定为什么上面的sn-p中没有用到...

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

}

【讨论】:

  • 如果TextView 是片段用户界面的一部分,那么活动与此关系不大。将意图附加内容作为参数传递给片段的全部原因是您可以在后者内部使用它们,对吗?我建议您阅读一些在线文档和 API 示例(可以通过 Android SDK 管理器下载)。
  • 当您在 XML 中指定片段而不是使用事务管理器时,有没有办法做到这一点?
  • @MH。不同意当您在 XML 中指定片段时进行数据更新是没有意义的。就我而言,这是一个食谱详细信息屏幕,我已经从一组搜索结果中获得了我需要的所有信息,并且想要打开一个详细信息屏幕。对于每个实例化的,它看起来会有所不同,但将具有所有相同的视图元素。用 XML 定义比用代码实例化有很多优势,尤其是样式、尺寸等。
  • @colabug:所以你的论点将是配方数据,或者至少是配方唯一的某种标识符,只有在运行时才知道。因此,我会选择动态实例化片段。但是,一个简单的替代方法是直接使用从活动中检索到的Intent 数据在片段上调用公共方法,如果您的应用更复杂并且在单个容器中处理不同的片段,则可以选择使用接口。
  • @JimG。是的,因为平台依赖于非参数化构造函数来动态(重新)创建Fragment 实例。 SO上有几个相关的问答,您可能会发现this one对阅读很有帮助。
猜你喜欢
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-20
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多