我被一个SurfaceView问题困扰,这个问题似乎与对这些SurfaceView回调的理解有关。让我们从理论上来解决这个问题:我有一个名为A的活动,它托管一个片段,在实时绘制一个对象,运行一个线程来完成这个任务(定期调用我的视图的绘制方法,并将其绘制在SurfaceView上)。然后我切换到活动B,它托管另一个显示一些UI的片段。每当我切换到这个活动B时,我可以看到SurfaceView被销毁了,因此调用了onSurfaceDestroyed()回调函数,在那里停止我的绘图线程。到目前为止,一切都很好,也很明显,但是当我回到活动A时,SurfaceView没有被创建,因此onSurfaceCreated()没有被调用,因此我的绘图线程不会启动。通过调试,我可以看到当我从B回到A时,我的视图存在,如果线程正在运行,它可以被绘制,但是为了使线程运行,我需要重新创建SurfaceView。所以,我的问题是:如果片段可见,为什么当我回到片段A时SurfaceView没有被创建?我很抱歉无法为这个问题提供任何代码,但它更多的是理论性的。编辑:进展更新。经过更多的研究和测试,我意识到任何片段的onCreateView()只在它的生命周期内调用一次,直到它被从片段管理器中删除并不再由框架管理。SurfaceView在使用它的片段变得不可见之前被销毁,但遗憾的是(我不明白为什么),当它再次变得可见时,它没有被重新创建,这是我的问题所在。我需要在该片段变得可见时重新创建SurfaceView,以便可以启动绘图线程,因为框架调用onSurfaceCreated()。
我试图绘制的布局由两个视图组成,一个由框架管理,另一个使用SurfaceView绘制。当我从B返回Activity A时,我知道片段是可见的,因为我可以看到由框架管理的视图适当地绘制,但是没有线程管理的那个视图的痕迹,这个SurfaceView还没有被创建。
onSurfaceDestroyed()
被调用,那么应该调用onSurfaceCreated()
。当Surface的大小或格式发生变化时,会调用onSurfaceChanged()
。请注意,这些都是由应用框架调用的--从应用程序中永远不要调用它们。可以在此处找到一些附加说明: https://source.android.com/devices/graphics/architecture.html#activity - faddenonCreateView()
而是调用了onResume()
。有点混乱:P。明天我会尝试弄清楚这种奇怪的行为。 - JorgeGRConSurfaceDestroyed()
,但当片段再次变为可见时,onSurfaceCreated()
未被触发。 - JorgeGRC