【问题标题】:onSurfaceCreated() is not called when activity resumes活动恢复时不调用 onSurfaceCreated()
【发布时间】:2015-04-22 11:56:46
【问题描述】:

我遇到了SurfaceView 问题,这个问题似乎与对这些SurfaceView 回调如何工作的任何误解有关。

让我们尝试从理论上解决这个问题:

我有一个活动A,托管一个fragment,它正在实时绘制一个对象,运行一个thread来完成这个任务(定期调用我的View的绘图方法并将其绘制在SurfaceView)。

然后我切换到活动 B,它承载了另一个显示一些 UI 的片段。
每当我切换到这个活动 B 时,我可以看到 SurfaceView 正在被销毁,因此会调用 onSurfaceDestroyed() 回调并在那里停止我的绘图线程。

现在一切都很好而且很明显,但是当我回到活动 A 时,SurfaceView 没有被创建,所以onSurfaceCreated() 没有被调用,因此我的绘图线程不会启动。
通过调试,我可以看到我的View在我从B返回到A时存在,如果线程正在运行,它可以被绘制,但对于我的线程运行,我需要再次创建SurfaceView

所以,我的问题(已编辑):
如果片段可见,为什么当我返回片段 A 时没有创建 SurfaceView

很抱歉,我无法为这个问题提供任何代码,但它比任何其他类型都更具理论性。

编辑:进度更新


在做了更多的研究和测试之后,我意识到任何片段的onCreateView()在它的生命周期中只被调用一次,直到它从片段管理器中删除并且不再由框架管理。

SurfaceView 在使用它的片段不再可见时被销毁,然后调用它为onDestroyView(),但遗憾的是(我不明白为什么)当它再次可见时不会重新创建,这就是我的问题的根源。我需要在该片段可见时再次创建 SurfaceView,以便它可以在框架调用 onSurfaceCreated() 时启动我的绘图线程。

我尝试绘制的布局由两个视图组成,一个由框架管理,另一个由 SurfaceView 绘制。当我从 B 回到活动 A 时,我知道该片段是可见的,因为我可以看到框架管理的视图被适当地绘制,但没有任何管理的痕迹由创建SurfaceView 时启动的线程,因为尚未创建此SurfaceView

【问题讨论】:

  • 如果 SurfaceView 的onSurfaceDestroyed() 被调用,那么onSurfaceCreated() 应该被调用。 onSurfaceChanged() 在表面的大小或格式发生变化时被调用。请注意,这些是由应用程序框架调用的——永远不要从应用程序中调用它们。可以在此处找到一些附加说明:source.android.com/devices/graphics/architecture.html#activity
  • 感谢您的评论。我让框架自己调用这些回调,但问题似乎是我没有实例化必须在 A 片段内正确绘制的视图。我再次调试,发现片段 A 没有调用onCreateView(),而是调用onResume(),当我从活动 B 回到活动 A 并显示片段时。解释得一团糟:P。明天我会尝试找出这种奇怪的行为。
  • @fadden 我已经用更多信息更新了这个问题。 onSurfaceCreated() 不会在片段再次可见时触发,尽管在片段由于活动切换而不再可见时调用了 onSurfaceDestroyed()

标签: android android-fragments android-activity surfaceview


【解决方案1】:

我仍然不知道为什么 android 框架不会自己创建 SurfaceView,但我所要做的就是强制 ViewVISIBLE 的可见性,这样就成功了.当我明确告诉ViewonResume()Fragment 方法中可见时,SurfaceHolder 回调开始按预期工作:

myView.setVisibility(View.VISIBLE);

【讨论】:

  • 我只想回答这个问题。 SurfaceView 没有被创建(我认为),因为 view 的可见性可能不是 VISIBLE。无论如何,如果您认为编辑问题并保持打开状态会更好,我会编辑它并添加此新信息。
  • 我认为这是最好的答案,正如您所做的那样。也许其他评论者不明白这可以解决您的问题,尽管 Android 为何不自行执行此操作仍然是个谜。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
相关资源
最近更新 更多