当活动恢复时,onSurfaceCreated()未被调用

3
我被一个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还没有被创建。


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

5

我仍然不知道为什么Android框架不会自己创建SurfaceView,但我所要做的就是强制将View的可见性设置为VISIBLE,这就解决了问题。在FragmentonResume()方法中明确告诉View可见后,SurfaceHolder回调函数开始按预期工作:

myView.setVisibility(View.VISIBLE);

1
我在回答中的意思只是要真正回答这个问题。SurfaceView 没有被创建(我想)是因为 view 的可见性可能不是 VISIBLE。无论如何,如果你认为编辑问题并保持其开放更好,我会添加这个新信息进行编辑。 - JorgeGRC
我认为这是最好的答案,就像你所做的那样。也许其他评论者没有理解这解决了你的问题,尽管为什么Android自己没有这样做仍然是个谜。 - ToolmakerSteve

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接