如何清除片段中的参数?
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()
以始终返回不同的包实例(防御性副本)
或者如果您在错误的时间更改参数
【讨论】:
以上是关于如何清除片段中的参数?的主要内容,如果未能解决你的问题,请参考以下文章
片段中的Tablayout + viewpager,需要清除viewpager中的edittext数据
如何以挂起的意图启动 Activity 并清除所有后台堆栈?