Android:holder.getSurface()总是返回null

问题描述:

我的视图是一堆普通的小部件和surfaceview。我不知道为什么在我得到SurfaceView的surfaceholder并且在持有者上再次使用getSurface()后,我总是会返回null。Android:holder.getSurface()总是返回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 
     } 

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

直接访问表面对象。 Surface可能并不总是 - 例如,在使用SurfaceView时,持有人的Surface 不会创建,直到视图已附加到窗口管理器 并执行布局以确定尺寸和屏幕 的位置表面。因此,您通常需要执行 Callback.surfaceCreated以了解Surface何时可以使用 。

我不明白这这么多,但我知道我有想念的东西。请为我解释,并告诉我有关Callback.surfaceCreated的手段,以及如何实施它?

谢谢:)

您要使用的表面时,它还不可用。没关系,您的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 
    } 
} 

而且比你需要设置这个回调SurfaceHolder:

surface.getHolder().addCallback(new MyCallback());