android-fragments 是否可以在片段被添加到Activity后将参数传递给它?

uoifb46i  于 2022-11-14  发布在  Android
关注(0)|答案(4)|浏览(125)

我知道,当你第一次示例化一个片段时,你可以用setArguments(Bundle)传递参数,然后用getArguments()在片段中检索它们。
然而,在我的应用中,有些片段在添加到Activity后会被多次分离和附加。在重新附加时,我可能需要向片段传递一个参数,以便在重新附加之前修改其内容。我可以在第一次显示片段时使用setArguments。但在以后的情况下,这将不起作用。savedInstanceState在这种情况下将不起作用,因为在分离片段之前我不知道参数的值。
我知道我可以只实现一个方法,在附加设置参数的片段之前调用该方法,但这似乎是API中已经存在的东西,而我只是没有看到它。
是否有一些内置的东西允许我这样做,或者我必须自己实现?为了记录在案,我正在使用支持包(v4)。
非常感谢!

nxagd54h

nxagd54h1#

是的,如果你在你的片段激活之前调用了setArguments(bundle),那么你的片段就有了一个可以更新的包。为了避免你的问题,你必须更新原始的包,并且不能再次调用setArguments。所以在你的初始片段构造之后,用如下代码修改片段参数

frg.getArguments().putString("someKey", "someValue");

然后,参数将在片段中可用,并将在方向更改等过程中保持和恢复。
注意,这个方法在布局中通过xml创建片段时也很有用。通常情况下,不能在这样的片段上设置参数;避免这种限制的方法是创建一个无参数构造器,它创建参数束,如下所示:

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

稍后,在Activity的onCreate方法中的某个位置,您可以执行以下操作:

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

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

camsedfj

camsedfj2#

你可以只在你的片段上公开一个方法,设置你想传递给它的任何东西。要调用它,你可以通过标签从后栈中检索片段,或者从你调用它的任何地方保留一个示例引用。
这对我来说很好,尽管你需要在空值检查方面保持警惕,以及在你附加或重新启动片段时意识到你的片段经历的生命周期。
据我所知,API中没有任何内容...
更新:这仍然是真的,而且工作得很好。我发现,一旦这是更复杂的,它是干净得多,更容易使用的东西,如Otto事件总线。强烈推荐imho。

kqhtkvqz

kqhtkvqz3#

是否可以在片段被添加到Activity后将参数传递给它?
不,不,不
但是,如果您正在寻找与片段绑定的Activity进行通信的方法,您可以使用@manfred提到的方法或文档中描述的其他方法
还有另一种有趣的方法可以让两个片段互相通信。那就是使用setTargetFragment和getTargetFragment方法。这里,如果fragmentB可以影响fragmentA,你将fragmentBsetTargetFragment更新到fragmentA,当需要从fragmentB内部更新到fragmentA时,您将通过((fragmentA) getTargetFragment())获得对它的引用,并访问fragmentA的方法来更新它。
希望有帮助祝你好运。

83qze16e

83qze16e4#

对我来说我做

fragment.arguments.putAll(newBundle)

那么在onStart中,您可以再次解析它,并根据需要设置变量,或者这样做。

相关问题