2012-03-07 53 views
23

我知道当你第一次实例化一个片段时,你可以使用setArguments(Bundle)来传递参数并使用在片段中检索它们。将参数添加到活动后,是否可以将参数传递给片段?

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

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

是否有内置的东西可以让我做到这一点,还是我必须自己实现?为了记录,我正在使用支持包(v4)。

非常感谢!

+0

你是什么意思重新附加?碎片将只附加到一次活动(AFAIK),如果它从活动中分离出来,它将被销毁。你的意思是当用户点击后退按钮片段返回到布局? – 500865 2012-03-07 23:06:42

回答

12

你可以在你的片段上公开一个方法,设置你想要传递给它的任何东西。要打电话给你,你可以通过标记从后台堆栈中检索片段,或者从您要调用的任何位置引用实例引用。

这对我来说很好,虽然你需要在空检查方面有所防御,以及了解片段在附加或重新启动时所经历的生命周期。

从我可以告诉有什么API中...

更新:这仍然是正确的和工作得很好。我发现一旦这个更复杂,它就会更简单,更容易使用诸如Otto事件总线之类的东西。强烈推荐imho。

+0

我传递的参数非常微不足道 - 它实际上并不是将内容添加到片段中,而是片段将基于其值显示/隐藏内容。这似乎有点过于直截了当,这让我想也许是因为我正在做的是API。可能不会。谢谢您的帮助! – 2012-03-08 17:10:13

2

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


但是,如果你正在寻找办法与活动传达给其一个片段捆绑,你可以做到这一点@manfred提到或描述的其他方式的方式Documentation

还有另一种有趣的方式来让两个片段相互沟通。这是通过使用setTargetFragmentgetTargetFragment方法。在这里,如果fragmentB会影响fragmentA,你会的fragmentBfragmentA当改变需要从内部fragmentB更新fragmentA,您将获得由 ((fragmentA) getTargetFragment())对它的引用和访问的fragmentA的方法来更新它setTargetFragment

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

+0

他并不是在询问与片段的交流,他问的是如何改变参数,一旦设置为片段 – 2015-09-01 05:59:19

+0

你的“否”是非常误导和不正确的,对于OPs问题的答案,你也引用了,完全由@ user3978046回答高于 – 2015-11-09 01:01:21

19

是的,如果你已经调用setArguments(bundle)之前你的片段变得活跃。然后从那里你的片段有一个你可以更新的包。为避免您的问题,您必须更新原始包,并且不得再次调用setArguments。所以,下面您最初的片段建设,修改片段论点如下代码

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

的参数,然后将在你的片段可用,将坚持并在方位的变化和这样的恢复。

请注意,在布局中通过xml创建片段时,此方法也很有用。通常,人们无法在这样的片段上设置参数;为了避免这种限制的方式是创建创建参数捆绑像这样一个无参数的构造函数:您的活动的onCreate方法

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

后来地方,那么你会怎么做:

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

这会将数据进入参数包,然后可以在您的片段中进行编码。

+0

雅,但是有没有办法让你的片段注意到你已经为这个包添加了参数?我想我可以添加参数,然后在活动可以调用的片段上公开一个方法,强制它重新检查参数。问题在于活动不知道片段处于生命周期的哪个阶段。 – Glaucus 2016-09-14 21:15:25