【问题标题】: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

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

【问题讨论】:

标签: android fragment


【解决方案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() 以始终返回不同的包实例(防御性副本)

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多