如何清除Fragment中的参数?

时间:2013-07-26 07:46:21

标签: android fragment

我有一个AudioPlayerFragment我用setArguments()传递了一些网址。

如果我的url实例的getArguments()中有AudioPlayerFragment个密钥,我会启动播放音频流的服务。如果已经有一个流播放,我会停止它并使用新流再次启动它。

如果没有参数,我什么都不做。

我的问题是参数与实例保持一致,所以当我回到它时,如果没有设置新的,getArguments()将返回最新的参数集。

因此,在阅读它们之后,我尝试使用

将参数设置为null
setArguments(null);

但是我得到了

Java.lang.IllegalStateException: fragment already active

我怎样才能清除这些论点?

5 个答案:

答案 0 :(得分:18)

在片段中的 onDestroyView()方法中调用this.getArguments().clear();

答案 1 :(得分:8)

确保您正在阅读片段getArguments()方法中的onCreate()。一旦片段被创建,当你回去时你不会通过onCreate(),所以你不应该再次阅读这些论点。

如果仍然无效,您可以使用布尔标志并只读取一次参数。

这样的事情:

if(!argumentsRead){

    // read arguments

    argumentsRead = true;
}

答案 2 :(得分:1)

我遇到过你想删除片段中的参数的情况。例如,第一次输入一个片段可能你有最新的数据,但是在片段重新创建后你不想要那些数据,你想要刷新。你可以像这样清除包中的元素:

getArguments().remove("cartDetails");

对于我写的案例,我在获取初始数据后将其放入片段的onCreate中。

答案 3 :(得分:0)

不要试图改变论点。在没有参数的情况下再次实例化Fragment并将其替换为旧的。

如果您不想重新创建UI并且只想尝试更改音乐或音频,您可以将音频功能与片段分离并将它们放入无头保留片段中,您就可以开始使用了。

答案 4 :(得分:0)

Bundle返回的getArguments()处于灰色区域。您不知道也不应该假定Fragment如何使用该Bundle实例。

问问自己会发生什么:

  • 如果他们决定更改getArguments()以始终返回其他分发包实例(防御性副本)

  • 或者如果您在错误的时间更改了参数