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

Jay*_*ont 27 android android-fragments

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

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

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

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

非常感谢!

use*_*046 23

是的,如果您在片段变为活动状态之前调用了setArguments(bundle).然后你的片段后面有一个你可以更新的包.要避免您的问题,您必须更新原始包,并且不得再次调用setArguments.所以在你的初始片段构造之后,用代码修改片段参数

frg.getArguments().putString("someKey", "someValue");
Run Code Online (Sandbox Code Playgroud)

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

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

public MyFragment() {
    this.setArguments(new Bundle());
}
Run Code Online (Sandbox Code Playgroud)

稍后在您的活动的onCreate方法中,您将执行以下操作:

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

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


Man*_*ser 14

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

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

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

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