【问题标题】:How can I know when my Fragment is ready to be viewed?我怎么知道我的 Fragment 何时可以查看?
【发布时间】:2014-08-18 03:36:09
【问题描述】:

我有一个片段,它附加了这样的动画:

FragmentManager fragmentManager = getFragmentManager();
fragmentManager.beginTransaction().setCustomAnimations(
                R.animator.card_flip_right_in, R.animator.card_flip_right_out,
                R.animator.card_flip_left_in, R.animator.card_flip_left_out)
                .replace(R.id.frame_container, fragment).commit();

我有两个顾虑。

1) 在动画开始之前,Fragment 不会完全渲染(片段中会发生一些相当复杂的事情,包括可能的 HTTP 调用,它会获取绘制所需的数据。

2) 在片段中还有其他动画,除非我确定用户确实在看它们,否则我不想开始它们。

我怀疑处理 (1) 的最佳方法是在 Fragment 报告它已完成所有部件的组装之前不要调用 commit(),但是对于 (2) 我看不出有什么办法知道它肯定是附加到 Activity 和渲染的(因此在 Fragment 内启动动画是安全的)。

所以,我想我的问题是...... commit() 是阻塞调用吗?我可以确定在下一行(或在 Fragment 过渡动画的末尾)渲染了 Fragment 并且可以安全地开始制作动画吗?或者我应该在 Transition 上使用动画侦听器并告诉 Fragment 在 Transition 动画完成后开始其内部动画?

【问题讨论】:

    标签: android android-fragments race-condition


    【解决方案1】:

    对于 1) 你的策略是正确的。在 Fragment 中设置某种调用,它可以告诉您它已经完成了设置所需的后台工作。或者,您可以在片段之外执行此操作,并将该数据作为片段构造的一部分传入。

    对于 2) commit() 不是阻塞调用,它是“在调度程序上抛出这个”调用。您也许可以使用onActivityCreated() 知道片段已正确创建并附加到窗口。当我过去做过类似的事情时,我在该方法中添加了一个延迟动画,该动画在片段管理器转换延迟过后触发以开始片段中的动画。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 2011-06-04
      • 1970-01-01
      • 2013-12-12
      • 2017-03-03
      • 2019-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多