我知道,当你第一次示例化一个片段时,你可以用setArguments(Bundle)
传递参数,然后用getArguments()
在片段中检索它们。
然而,在我的应用中,有些片段在添加到Activity后会被多次分离和附加。在重新附加时,我可能需要向片段传递一个参数,以便在重新附加之前修改其内容。我可以在第一次显示片段时使用setArguments
。但在以后的情况下,这将不起作用。savedInstanceState
在这种情况下将不起作用,因为在分离片段之前我不知道参数的值。
我知道我可以只实现一个方法,在附加设置参数的片段之前调用该方法,但这似乎是API中已经存在的东西,而我只是没有看到它。
是否有一些内置的东西允许我这样做,或者我必须自己实现?为了记录在案,我正在使用支持包(v4)。
非常感谢!
4条答案
按热度按时间nxagd54h1#
是的,如果你在你的片段激活之前调用了setArguments(bundle),那么你的片段就有了一个可以更新的包。为了避免你的问题,你必须更新原始的包,并且不能再次调用setArguments。所以在你的初始片段构造之后,用如下代码修改片段参数
然后,参数将在片段中可用,并将在方向更改等过程中保持和恢复。
注意,这个方法在布局中通过xml创建片段时也很有用。通常情况下,不能在这样的片段上设置参数;避免这种限制的方法是创建一个无参数构造器,它创建参数束,如下所示:
稍后,在Activity的onCreate方法中的某个位置,您可以执行以下操作:
这会将数据放入参数包中,然后片段中的代码就可以使用该参数包。
camsedfj2#
你可以只在你的片段上公开一个方法,设置你想传递给它的任何东西。要调用它,你可以通过标签从后栈中检索片段,或者从你调用它的任何地方保留一个示例引用。
这对我来说很好,尽管你需要在空值检查方面保持警惕,以及在你附加或重新启动片段时意识到你的片段经历的生命周期。
据我所知,API中没有任何内容...
更新:这仍然是真的,而且工作得很好。我发现,一旦这是更复杂的,它是干净得多,更容易使用的东西,如Otto事件总线。强烈推荐imho。
kqhtkvqz3#
是否可以在片段被添加到Activity后将参数传递给它?
不,不,不
但是,如果您正在寻找与片段绑定的Activity进行通信的方法,您可以使用@manfred提到的方法或文档中描述的其他方法
还有另一种有趣的方法可以让两个片段互相通信。那就是使用setTargetFragment和
getTargetFragment
方法。这里,如果fragmentB
可以影响fragmentA
,你将fragmentB
的setTargetFragment
更新到fragmentA
,当需要从fragmentB
内部更新到fragmentA
时,您将通过((fragmentA) getTargetFragment())
获得对它的引用,并访问fragmentA
的方法来更新它。希望有帮助祝你好运。
83qze16e4#
对我来说我做
那么在onStart中,您可以再次解析它,并根据需要设置变量,或者这样做。