17

我有一个AudioPlayerFragment使用 setArguments() 传递一些 url 的地址。

如果我的实例中有一个url键,我将启动一个播放音频流的服务。如果已经有一个流在播放,我会停止它并用新的流重新启动它。getArguments()AudioPlayerFragment

如果没有争论,我什么也不做。

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

因此,在阅读它们之后,我尝试将参数设置为 null

setArguments(null);

但我明白了

Java.lang.IllegalStateException: fragment already active

那我该如何清除论点呢?

4

5 回答 5

36

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

于 2016-10-25T12:01:57.300 回答
13

确保您正在阅读片段getArguments()onCreate()方法。创建片段后,返回时您不会通过 trough onCreate(),因此您应该无法再次阅读论点。

如果这仍然不起作用,您可以使用布尔标志并仅读取一次参数。

像这样的东西:

if(!argumentsRead){

    // read arguments

    argumentsRead = true;
}
于 2013-07-26T07:52:47.673 回答
5

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

getArguments().remove("cartDetails");

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

于 2017-08-02T10:20:29.240 回答
0

不要试图改变论点。再次实例化片段,不带参数,并将其替换为旧片段。

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

于 2013-07-26T07:52:19.150 回答
0

Bundle由谎言返回的变异getArguments()在灰色区域。您不知道也不应该推测如何Fragment使用该Bundle实例。

问问自己会发生什么:

  • 如果他们决定更改getArguments()为始终返回不同的捆绑实例(防御性副本)

  • 或者如果你在错误的时间改变论点

于 2020-04-19T23:46:18.273 回答