从活动中设置片段的参数

时间:2013-08-08 10:51:27

标签: android android-fragments android-activity

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

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

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

3 个答案:

答案 0 :(得分:39)

AFAIK,当您将片段嵌入XML中时,不能使用setArguments()。如果它很重要,那么最好动态添加片段。但是,如果您真的希望通过XML嵌入片段,则可以通过不同的方式传递数据。

  1. 让Activity实现片段的事件监听器。然后让片段在创建时或在需要时从Activity请求所需的参数。 Communication with Fragment
  2. 创建可以与片段一起嵌入xml的自定义属性。然后在片段的膨胀过程中,解析自定义属性以获取其数据。 Custom fragment attributes
  3. 在片段中创建公共setter并让活动直接使用它们。如果在片段的onCreate()方法之前设置它们至关重要,那么请从活动的onAttachFragment()方法中进行设置。

答案 1 :(得分:5)

这里有两个选择

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

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

    public DetailFragment() {
        this.setArguments(new Bundle());
    }
    
  3. 然后在您的活动中,您可以使用以下代码添加所需的任何参数:

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

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

答案 2 :(得分: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;
}

从活动

中附加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));