24

我想将我的活动中的参数传递给嵌入到活动中的片段。片段静态嵌入在 xml 布局中。我试图这样调用 setArgument() :

setContentView(R.layout.detail_activity);
DetailFragment detailFragment = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
detailFragment.setArguments(getIntent().getExtras());

但已经太晚了,因为 setArguments 必须在片段创建后立即调用。我唯一看到的是 getArguments() 并更改了捆绑包。有更好的办法吗?

4

3 回答 3

44

setArguments()AFAIK,当您将片段嵌入 XML 时,您不能这样使用。如果它很关键,你最好动态添加片段。但是,如果您确实希望通过 XML 嵌入片段,则可以通过不同的方式传递该数据。

  1. 让 Activity 实现片段的事件侦听器。然后让片段在创建时或需要时从 Activity 请求所需的参数。 与 Fragment 的通信
  2. 创建可以与片段一起嵌入到 xml 中的自定义属性。然后在片段的膨胀过程中,解析自定义属性以获取它们的数据。自定义片段属性
  3. 在片段中创建公共设置器并让活动直接使用它们。如果在片段的方法之前设置它们很关键onCreate(),那么从活动的onAttachFragment()方法中进行。
于 2014-04-22T17:25:22.177 回答
5

你在这里有两个选择

  1. 如果您只需要活动意图中的信息,那么将意图中的信息放入片段参数只会增加一个不需要的步骤。你可能只是保持简单,从你的片段调用

    Bundle data = getActivity().getIntent().getExtras();
    
  2. 如果您需要添加不在活动意图中的信息,那么在您的片段中创建一个无参数构造函数,例如:

    public DetailFragment() {
        this.setArguments(new Bundle());
    }
    

然后在您的活动中,您可以使用以下代码添加所需的任何参数:

    DetailFragment frg = (DetailFragment) getFragmentManager().findFragmentById(R.id.detailFragment);
    frg.getArguments().putBundle("key", data);

这里的重点是使用现有的 bundle 对象,而不是在片段附加到活动后尝试调用 setArguments()。

于 2014-08-29T08:23:27.053 回答
4

将数据传递给 Fragment 的另一种方法如下:

//In DetailFragment (for Instance) define a public static method to get the instance of the fragment

public static final DetailFragment getInstance(Bundle data) {
    DetailFragment fragment = new DetailFragment();
    fragment.setArguments(data);
    return fragment;
}

从 Activity 内部附加 DetailFragment 时

Bundle data = new Bundle();
//Add data to this bundle and pass it in getInstance() of DetailFragment
fragmentTransaction.replace(R.id.frament_layout, DetailFragment.getInstance(data));
于 2015-10-06T05:31:25.477 回答