activity 恢复时不调用 onSurfaceCreated()
onSurfaceCreated() is not called when activity resumes
我遇到了一个 SurfaceView
问题,这个问题似乎与对这些 SurfaceView
回调如何工作的任何误解有关。
让我们尝试从理论上解决这个问题:
我有一个 activity A,托管一个实时绘制对象的 fragment
,运行宁一个 thread
完成这个任务(周期性调用我的View
的绘图方法,在SurfaceView
上绘制)。
然后我切换到 activity B,其中包含另一个显示一些 UI.
的片段
每当我切换到此 activity B 时,我都可以看到 SurfaceView
正在被销毁,因此调用 onSurfaceDestroyed()
回调并停止绘图在那里线程。
现在一切都很好很明显,但是当我回到 activity A 时,SurfaceView
没有被创建,所以 onSurfaceCreated()
没有被调用,因此我的绘图线程不会启动。
通过调试,当我从B返回到A时,我可以看到我的View
存在,如果线程可以绘制它是 运行ning,但对于 运行 的线程,我需要再次创建 SurfaceView
。
所以,我的问题(已编辑):
如果片段可见,为什么当我返回片段 A 时未创建 SurfaceView
?
很抱歉,我无法为这个问题提供任何代码,但它比任何其他问题都更具理论性。
编辑:进度更新
在做了更多的研究和测试之后,我意识到任何片段的 onCreateView()
在其生命周期中只被调用一次,直到它从片段管理器中删除并且不再由框架管理。
SurfaceView
在使用它的片段变得不再可见时被销毁,然后调用它是 onDestroyView()
,但遗憾的是(我不明白为什么)当它再次可见时不会重新创建,这就是我的问题的根源。我需要在该片段变得可见时再次创建 SurfaceView
,以便它可以在框架调用 onSurfaceCreated()
.
时启动我的绘图线程
我要绘制的布局由两个视图组成,一个由框架管理,另一个使用 SurfaceView 绘制。当我从 B 回到 Activity A 时,我知道片段是可见的,因为我可以看到框架管理的视图适当地绘制,但没有痕迹由创建 SurfaceView
时启动的线程管理,因为尚未创建此 SurfaceView
。
我仍然不知道为什么 android 框架不会自己创建 SurfaceView
,但我所要做的就是强制 View
的VISIBLE
的可见性,这就成功了。当我明确告诉 View
在 Fragment
的 onResume()
方法中可见时,SurfaceHolder
回调开始按预期工作:
myView.setVisibility(View.VISIBLE);
我遇到了一个 SurfaceView
问题,这个问题似乎与对这些 SurfaceView
回调如何工作的任何误解有关。
让我们尝试从理论上解决这个问题:
我有一个 activity A,托管一个实时绘制对象的 fragment
,运行宁一个 thread
完成这个任务(周期性调用我的View
的绘图方法,在SurfaceView
上绘制)。
然后我切换到 activity B,其中包含另一个显示一些 UI.
的片段
每当我切换到此 activity B 时,我都可以看到 SurfaceView
正在被销毁,因此调用 onSurfaceDestroyed()
回调并停止绘图在那里线程。
现在一切都很好很明显,但是当我回到 activity A 时,SurfaceView
没有被创建,所以 onSurfaceCreated()
没有被调用,因此我的绘图线程不会启动。
通过调试,当我从B返回到A时,我可以看到我的View
存在,如果线程可以绘制它是 运行ning,但对于 运行 的线程,我需要再次创建 SurfaceView
。
所以,我的问题(已编辑):
如果片段可见,为什么当我返回片段 A 时未创建 SurfaceView
?
很抱歉,我无法为这个问题提供任何代码,但它比任何其他问题都更具理论性。
编辑:进度更新
在做了更多的研究和测试之后,我意识到任何片段的 onCreateView()
在其生命周期中只被调用一次,直到它从片段管理器中删除并且不再由框架管理。
SurfaceView
在使用它的片段变得不再可见时被销毁,然后调用它是 onDestroyView()
,但遗憾的是(我不明白为什么)当它再次可见时不会重新创建,这就是我的问题的根源。我需要在该片段变得可见时再次创建 SurfaceView
,以便它可以在框架调用 onSurfaceCreated()
.
我要绘制的布局由两个视图组成,一个由框架管理,另一个使用 SurfaceView 绘制。当我从 B 回到 Activity A 时,我知道片段是可见的,因为我可以看到框架管理的视图适当地绘制,但没有痕迹由创建 SurfaceView
时启动的线程管理,因为尚未创建此 SurfaceView
。
我仍然不知道为什么 android 框架不会自己创建 SurfaceView
,但我所要做的就是强制 View
的VISIBLE
的可见性,这就成功了。当我明确告诉 View
在 Fragment
的 onResume()
方法中可见时,SurfaceHolder
回调开始按预期工作:
myView.setVisibility(View.VISIBLE);