我有一个AudioPlayerFragment
我用setArguments()传递了一些网址。
如果我的url
实例的getArguments()
中有AudioPlayerFragment
个密钥,我会启动播放音频流的服务。如果已经有一个流播放,我会停止它并使用新流再次启动它。
如果没有参数,我什么都不做。
我的问题是参数与实例保持一致,所以当我回到它时,如果没有设置新的,getArguments()
将返回最新的参数集。
因此,在阅读它们之后,我尝试使用
将参数设置为nullsetArguments(null);
但是我得到了
Java.lang.IllegalStateException: fragment already active
我怎样才能清除这些论点?
答案 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()
以始终返回其他分发包实例(防御性副本)
或者如果您在错误的时间更改了参数