2012-07-15 202 views
3

我的視圖是一堆普通的小部件和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的手段,以及如何實施它?

謝謝:)

回答

10

您要使用的表面時,它還不可用。沒關係,您的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());