在将片段添加到活动后,是否可以将参数传递给片段?

时间:2012-03-07 21:58:25

标签: android android-fragments

我知道当你第一次实例化一个片段时,你可以使用setArguments(Bundle)传递参数,并使用getArguments()在片段中检索它们。

但是,在我的应用程序中,我将片段添加到活动后将分离并附加多次。在重新附加时,我可能需要传递一个片段和一个参数来修改其内容,然后再重新附加它。我可以在第一次显示片段时使用setArguments,但在后续的情况下无法使用。 savedInstanceState在这种情况下不起作用,因为在分离片段之前我不知道参数的值。

我知道我可以在附加设置参数的片段之前实现一个我会调用的方法,但看起来这可能已经存在于API中了,我只是没有看到它。 / p>

是否有内置功能可以让我这样做,或者我必须自己实现这个功能?为了记录,我正在使用支持包(v4)。

非常感谢!

3 个答案:

答案 0 :(得分:22)

是的,如果您在片段变为活动状态之前调用了setArguments(bundle)。然后你的片段后面有一个你可以更新的包。要避免您的问题,您必须更新原始包,并且不得再次调用setArguments。因此,在初始片段构造之后,使用类似

的代码修改片段参数
frg.getArguments().putString("someKey", "someValue");

然后这些参数将在您的片段中提供,并将在方向更改等过程中保留和恢复。

注意当在布局中通过xml创建片段时,此方法也很有用。通常人们无法在这样的片段上设置参数;避免这种限制的方法是创建一个无参数构造函数,它创建参数包,如下所示:

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

稍后在你的活动的onCreate方法的某个地方你会做:

FragmentManager mgr = this.getSupportFragmentManager();
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment);
Bundle bdl = frg.getArguments();
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData);

这会将数据放入参数包中,然后可以使用片段中的代码。

答案 1 :(得分:14)

您可以在片段上公开一个方法,设置您想要传递给它的任何内容。要打电话,你可以例如通过标记从backstack检索片段,或者从您调用它的任何地方保留实例引用。

这对我很有用,虽然你需要在空检查方面保持防御,例如你知道你的片段在你附加它或重新启动它时所经历的生命周期。

据我所知,API中没有任何内容......

更新:这仍然是正确的,并且运行正常。我发现,一旦这更复杂,使用像Otto eventbus这样的东西会更清晰,更容易。强烈推荐imho。

答案 2 :(得分:2)

  

是否可以在将片段添加到活动后将其传递给片段?

没有


但是,如果您正在寻找与片段绑定的活动进行通信的方法,您可以按照@manfred提到的方式或Documentation

中描述的其他方式进行操作

还有另一种有趣的方法让2个片段相互通信。这是使用setTargetFragmentgetTargetFragment方法。在此处,如果fragmentB影响fragmentA,您setTargetFragment fragmentB fragmentA以及需要将更改更新为fragmentA时才会fragmentB((fragmentA) getTargetFragment())内,您将获得对它的引用 fragmentA并访问{{1}}的方法进行更新。

希望它有所帮助。祝你好运。