【问题标题】:Where to initiate views in Fragment? onViewCreated or onActivityCreated在 Fragment 中哪里启动视图? onViewCreated 或 onActivityCreated
【发布时间】:2018-11-06 13:33:28
【问题描述】:

那么,在片段中启动视图的最佳位置在哪里?我们知道我们应该只在 onCreate() 内部扩展一个布局,而不是启动视图,比如设置监听器。

您应该在 onCreateView 中扩展您的布局,但不应该在 onCreateView 中使用 findViewById 初始化其他视图。

我们知道onViewCreated() 是在onCreateView() 之后立即调用的,基本上视图已经膨胀,一切都准备好了。但问题是每次转到另一个页面并返回时都会调用onViewCreated!因此,如果您在此处启动视图,例如添加一些侦听器,因为 onViewCreated 被多次调用,您最终会多次启动视图。

所以我的问题是:

  • 我理解onCreateView()onViewCreated 对吗?
  • 使用onActivityCreated 启动视图是否正确,因为它只调用一次,并且在onCreateView() 之后调用?

【问题讨论】:

  • 不,如果您不想破坏视图,则应更改 ViewPagers 屏幕外页面限制。否则你将违反 Fragments 生命周期。请参阅 Fragments onDestroyView 方法。

标签: android android-fragments android-lifecycle android-inflate fragment-lifecycle


【解决方案1】:

你应该在onCreateView() 中膨胀你的View

然后你应该在onViewCreated() 中设置你的View。不过,很多人只是在充气后将View设置为onCreateView()

如果该函数被多次调用,则Fragment 本身已被破坏,需要重建。

【讨论】:

  • 好吧,我不确定片段是否被破坏!因为当你从一个片段导航到某个地方并返回时,onCreateView 不会被调用,但onViewCreated 会。还有你怎么看onActivityCreated
  • 你有minimal reproducible example吗?我很想看看直接发生了什么。我的期望是 onViewCreated() 应该只在创建视图后调用一次。但是,我承认我是喜欢在onCreateView() 中处理所有 UI 的人之一。 -- 至于onActivityCreated(),我只会在需要保证从Fragment 访问Activity 的情况下使用它。过去最好的回话方式是使用带有回调的Interface。一旦调用了onActivityCreated(),您就知道该活动已准备好被调用。
  • 是的,我认为根据this link 它发生在使用片段事务时
  • @Knossos 是否有可能 onViewCreated 过载并且那里发生的一些事情没有足够的时间来正确准备,我们需要使用 onViewCreated?您是否遇到过需要 onViewCreated 解决的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 2017-07-23
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多