Android:holder.getSurface()始终返回null

hqt*_*hqt 3 android surfaceview android-layout surfaceholder

我的观点是一堆普通的小部件和一个表面视图.我不知道为什么在得到surfaceholderSurfaceView并getSurface()再次使用holder之后,我将始终返回null.

这是我的示例代码:

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.view);
    }

    @Override
    public void onResume() {
        super.onResume();
        surface = (SurfaceView) findViewById(R.id.surfaceView);
        this.holder = surface.getHolder();

         if (holder.getSurface().isValid()){  // get surface again
             Log.i("Notice","Surface holder is valid");
         }
         else
             Log.i("Notice","Surface holder ISNOT valid");  //Always receive this
        }
Run Code Online (Sandbox Code Playgroud)

当我看到Android文档的getSurface()方法时.这是怎么说的:

直接访问表面对象.Surface可能并不总是可用 - 例如,在使用SurfaceView时,在将视图附加到窗口管理器并执行布局以确定Surface的尺寸和屏幕位置之前,不会创建支架的Surface.因此,您通常需要实现Callback.surfaceCreated以找出Surface何时可用.

我不太了解这一点,但我知道我错过了一些东西.请为我解释,并告诉我有关Callback.surfaceCreated手段,以及如何实施它?

谢谢 :)

And*_*ich 11

您正在尝试使用表面尚不可用.这是正常的它是不是可在您Activity.onCreateActivity.onResume因为实际上表面被放置在单独的窗口中的活动窗口的后面,有自己的生命周期方法.您需要实现SurfaceHolder.Callback来接收有关Surface可用性的事件,并从单独的线程进行绘制.查看Android SDK示例文件夹中的LunarLander项目,它显示了如何正确使用SurfaceView.

你的回调看起来像这样:

public class MyCallback implements SurfaceHolder.Callback {
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, 
        int width, int height) {    
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // you need to start your drawing thread here
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {  
        // and here you need to stop it
    }
}
Run Code Online (Sandbox Code Playgroud)

而且您需要将此回调设置为SurfaceHolder:

surface.getHolder().addCallback(new MyCallback());
Run Code Online (Sandbox Code Playgroud)