【问题标题】:Distinguish first vs followings onCreateView's call in fragment在片段中区分首先与以下 onCreateView 的调用
【发布时间】:2018-01-19 22:40:17
【问题描述】:

可能这是一个众所周知的话题,但我没有找到任何“通用”的解决方案。

主要问题有两个:

  • fragment 被放入 backstack 时,onSavedInstanceState 永远不会被调用
  • 为什么不能在onCreate 中实例化fragment's 视图?

此时我的问题是:因为fragment lifecycleresume 都会经过onCreateView,并且因为我们不能在onCreate 中实例化views;为什么每次显示fragment 时我们都必须重新创建views?必须有一种方法,如ActivityonCreate

我们可能会通过添加class-scoped boolean 来避免并检查它是否有值,但这意味着添加if,这不是最好的解决方案。另一个解决方案可能是this one,但这也是一种解决方法,它也有一些限制。

是否有解决此问题的内置(或标准)解决方案?

【问题讨论】:

    标签: android fragment-lifecycle


    【解决方案1】:

    我不清楚你的问题标题的含义 - 但我可以回答这三点:

    当一个片段被放入回栈时,onSavedInstanceState 永远不会被调用

    onSavedInstanceState 在保存状态时被调用 - 只是添加到后台堆栈不会导致这种情况发生 - 如果有一些 UI 显示,它会在暂停片段时发生。实际上存在解决此问题的好答案here (link)

    为什么不能在 onCreate 中实例化片段的视图?

    一个fragment是从一个Activity的onPostResume方法中恢复过来的,此时你才能安全的接触到一个fragment的views。 (片段内可以使用onViewsCreated

    为什么每次显示片段时我们都必须重新创建视图

    这可以通过保留你的片段实例来避免(尽管有drawbacks)。您可以使用以下方法保留:

    setRetainInstance(true)
    

    【讨论】:

    • 感谢您的回答!我只有几个问题:afaik,使用活动的 onSavedInstanceState 在使用 ViewPager 时会出现一些问题,对吗?第二个是保留是一个不错的选择,但正如您所指出的,它有几个问题(首先是性能问题)。但如果这些是唯一的选择,我真的没有太多可能性:)
    • 那么,你的目标是什么?只是想知道它是否是第一次显示特定片段?为此,您的 class-scoped boolean 绝对是最干净的方法。如果没有,您的活动可以将片段中的值存储在它自己的状态中(包括在恢复时恢复变量(而不是视图)),而不是从片段中获取完整的实例状态
    • 好的,谢谢!是的,我想知道这是不是第一次,这样我可以避免每次弹出片段时都调用view.findViewById(...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    • 2016-06-13
    • 1970-01-01
    相关资源
    最近更新 更多