Android:使用SurfaceView重新获得焦点

mcc*_*ean 5 java android surfaceview

我现在正在掌握Android,玩弄Lunar Lander样本.

我发现如果你离开应用程序(例如,点击通话按钮),它将破坏底层表面(调用surfaceDestroyed).

导航回来(将触发onWindowVisibilityChanged)应用程序将崩溃,因为它将尝试绘制到表面而不重新创建它.

是否有一些我可以放入onWindowVisibilityChanged(或其他任何地方)的代码可以重新生成SurfaceView的底层表面并很好地恢复执行?

感觉这应该是一个简单的函数调用,但我在API文档中找不到任何东西.

谢谢!

mcc*_*ean 1

误诊!应用程序会自动重新创建表面,但其中有一个调用会在创建表面之前尝试对其进行绘制。

解决问题:

boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
    mSurfaceExists = false;
    ...
}

public void surfaceCreated(SurfaceHolder holder) {
    mSurfaceExists = true;
    ...
}

protected void onWindowVisibilityChanged(int visibility) {
    // only call base if there's a surface
    if(mSurfaceExists)
        super.onWindowVisibilityChanged(visibility);
}
Run Code Online (Sandbox Code Playgroud)

现在一切都膨胀了。(无论如何,据我所知 - Java/Android 专家如果这是不好的做法,请随时发表评论!)