如何清除片段中的参数?

Posted

技术标签:

【中文标题】如何清除片段中的参数?【英文标题】:How to clear arguments in Fragment? 【发布时间】:2013-07-26 09:24:47 【问题描述】:

我有一个AudioPlayerFragment,我使用 setArguments() 将一些 url 传递给它。

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

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

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

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

setArguments(null);

但我明白了

Java.lang.IllegalStateException: fragment already active

那我怎样才能清除争论呢?

【问题讨论】:

看这里:***.com/a/15084683/1276374 【参考方案1】:

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

【讨论】:

remove(key) 用于特定的 @Balflear,很奇怪,但它对我不起作用。你检查过这个论点真的删除了吗?【参考方案2】:

确保您在片段的onCreate() 方法中读取getArguments()。创建片段后,返回时您不会通过onCreate(),因此您应该无法再次读取参数。

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

类似这样的:

if(!argumentsRead)

    // read arguments

    argumentsRead = true;

【讨论】:

【参考方案3】:

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

getArguments().remove("cartDetails");

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

【讨论】:

【参考方案4】:

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

如果您不想重新创建 UI 并且只尝试更改音乐或音频,您可以将音频功能与片段分离,并将它们放在无头保留片段中,一切顺利。

【讨论】:

这实际上就是我所做的,除了单击主页按钮并返回应用程序时,调用相同的实例。 您可以使用 savedInstanceState。您可以保存状态 onSaveInstanceState。然后你的 Fragment 的 onCreate() 函数,你可以先检查 savedState 然后是参数。如果有一个 savedState,就不要看参数。【参考方案5】:

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

问问自己会发生什么:

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

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

【讨论】:

以上是关于如何清除片段中的参数?的主要内容,如果未能解决你的问题,请参考以下文章

清除 ASP.net 中的按钮名称参数

片段中的Tablayout + viewpager,需要清除viewpager中的edittext数据

如何以挂起的意图启动 Activity 并清除所有后台堆栈?

ViewModel 在导航导航中没有被清除,并且 viewmodel 中的实时数据保持活动状态

如何从片段外部清除/重置地图?

滑动 ViewPager 时如何清除片段相关状态