2012-07-15 5 views
3

내보기는 일반적인 위젯과 표면보기의 무리입니다. 왜 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 
     } 

내가 getSurface() 방법에 대한 안드로이드 문서를 볼 때 :

여기 내 예제 코드입니다. 이 말은 다음과 같습니다.

표면 개체에 대한 직접 액세스. 표면이 항상 일 수는 없습니다. 예를 들어 SurfaceView를 사용하는 경우 홀더의 표면 은 창 관리자 에 뷰가 첨부되고 레이아웃을 수행하여 치수 및 화면을 결정하기 위해 생성됩니다. 표면. 따라서 Surface를 사용할 수있는 경우를 확인하려면 Callback.surfaceCreated를 구현해야합니다.

나는 이것을 너무 많이 이해하지 못한다. 그러나 나는 뭔가를 놓친다는 것을 안다. 제게 설명해 주시고 Callback.surfaceCreated 의미에 대해 말씀해 주시고 구현 방법을 알려주십시오. 아직 사용할 수없는 경우

감사합니다 :)

답변

10

당신은 표면을 사용하려고합니다. 사실 표면은 활동 창 뒤에 별도의 창에 배치되고 자체 수명주기가 있으므로 Activity.onCreate 또는 Activity.onResume 메서드에서는 사용할 수 없습니다. Surface에 대한 이벤트를 수신하고 별도의 스레드에서 그리려면 SurfaceHolder.Callback을 구현해야합니다. 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());