我知道当你第一次实例化一个片段时,你可以使用setArguments(Bundle)
传递参数,并使用getArguments()
在片段中检索它们。
但是,在我的应用程序中,我将片段添加到活动后将分离并附加多次。在重新附加时,我可能需要传递一个片段和一个参数来修改其内容,然后再重新附加它。我可以在第一次显示片段时使用setArguments
,但在后续的情况下无法使用。 savedInstanceState
在这种情况下不起作用,因为在分离片段之前我不知道参数的值。
我知道我可以在附加设置参数的片段之前实现一个我会调用的方法,但看起来这可能已经存在于API中了,我只是没有看到它。 / p>
是否有内置功能可以让我这样做,或者我必须自己实现这个功能?为了记录,我正在使用支持包(v4)。
非常感谢!
答案 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个片段相互通信。这是使用setTargetFragment和getTargetFragment
方法。在此处,如果fragmentB
影响fragmentA
,您setTargetFragment
fragmentB
fragmentA
以及需要将更改更新为fragmentA
时才会fragmentB
在((fragmentA) getTargetFragment())
内,您将获得对它的引用
fragmentA
并访问{{1}}的方法进行更新。
希望它有所帮助。祝你好运。