【问题标题】:Android Fragments: When to use hide/show or add/remove/replace?Android 片段:何时使用隐藏/显示或添加/删除/替换?
【发布时间】:2012-10-31 00:11:51
【问题描述】:

假设我希望将某个容器视图中的当前片段替换为另一个。是不是用replace更好...

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.replace(R.id.fragment_container, newFragment, null);
    ft.commit();

...或以下,显示和隐藏?

    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.hide(oldFragment);
    ft.show(newFragment);
    ft.commit();

有一种方法更有效吗?找不到有关何时使用这些方法或它们如何影响所涉及片段的生命周期的太多信息。 谢谢!

【问题讨论】:

  • 如果我从片段 A 转到片段 B,然后返回片段 A,我如何确保不会在片段 A 上调用 onCreateView 等生命周期事件?按标签查找片段有效吗?

标签: android android-fragments


【解决方案1】:

您应该考虑您计划对片段执行的操作,以决定遵循哪条路径。如果你使用 FragmentTransaction 来隐藏 Fragment,那么它仍然可以处于其生命周期的运行状态,但它的 UI 已经与窗口分离,因此不再可见。因此,从技术上讲,您仍然可以与片段交互,并在以后需要时重新附加其 UI。如果您替换片段,您实际上是将其从容器中拉出,它将经历生命周期中的所有拆卸事件(onPause、onStop 等),如果由于某种原因您再次需要该片段,您将不得不将其重新插入容器并让它再次运行所有初始化。

如果您很有可能再次需要该片段,则只需将其隐藏,因为重绘其布局比完全重新初始化它的成本更低。

【讨论】:

  • 根据我们的需要,初始化片段是相当昂贵的,所以我们可能会选择hide()show() 来节省!谢谢!
  • 嗨,当你说从窗口分离时,你的意思是 onDetach() 回调会被调用吗?我试验了一下,好像不是这样的。
  • 可能他的意思是“分离”;片段也可以分离/重新附加(除了添加/删除,显示/隐藏)
  • @Zainodis,我也有同样的问题。我的解决方案是将片段的隐藏状态保存在 onSaveInstanceState() - savedInstanceState.putBoolean(STATE_HIDDEN, isHidden());然后在 onCreate() if (savedInstanceState != null) 中获取隐藏状态,如果片段被隐藏,则使用事务隐藏它。
  • @worawee.s 嘿,谢谢你的更新 :) !我不久前解决了这个问题 - 我真的不需要隐藏/显示等,所以我完全放弃了它,现在我正在使用像添加/替换或单个窗格中的单个片段活动这样的标准(基本上是主细节流) .对于那些仍在使用 hide 的人,您的解决方案将非常有帮助 - 不检查 savedInstance != null 是我之前犯的错误之一。
【解决方案2】:

你基本上是自己回答的。如果您想替换(不再需要旧片段),请使用replace(),如果您想暂时隐藏它,请使用hide()

【讨论】:

  • 基本上replace确实removeAll。我找不到匹配的 hideAll :(
  • @AlikElzin-kilaka 在我的活动 3 片段中的所有三个片段中,我从网络获取数据我应该遵循哪种方法
【解决方案3】:

我在我的活动中使用了隐藏/显示方法,其中包含 4 个片段,它解决了我的解决方案,但是当我显示我的对话框时随机出现一段时间,当我使用添加和替换方法时,它会给出窗口错误令牌异常,然后不会发生错误令牌异常,所以我认为显示/隐藏方法并不完美

【讨论】:

    【解决方案4】:

    如果视图“重”,我认为应该使用隐藏/显示。有这样的回调:onHiddenChanged。如果您使用隐藏/显示会很有帮助。

    【讨论】:

      猜你喜欢
      • 2014-10-29
      • 2022-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-27
      • 2012-12-30
      • 1970-01-01
      相关资源
      最近更新 更多