3

私のビューは、通常のウィジェットとサーフェスビューの集まりです。surfaceholderSurfaceViewを取得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()メソッドのAndroidドキュメントを見ると。これはそれが言う方法です:

表面オブジェクトへの直接アクセス。サーフェスは常に利用できるとは限りません。たとえば、SurfaceView を使用する場合、ビューがウィンドウ マネージャにアタッチされ、サーフェスの寸法と画面位置を決定するためにレイアウトが実行されるまで、ホルダーのサーフェスは作成されません。したがって、通常は、Surface がいつ使用可能になるかを調べるために Callback.surfaceCreated を実装する必要があります。

私はこれをあまり理解していませんが、何かが欠けていることは知っています。私のために説明し、Callback.surfaceCreated手段とそれを実装する方法を教えてください。

ありがとう :)

4

2 に答える 2

13

Surface がまだ利用できないときに使用しようとしています。実際には Surface が Activity ウィンドウの後ろの別のウィンドウに配置され、独自のライフサイクルがあるため、Activity.onCreateまたはメソッドで使用できないことは問題ありません。可用性に関するイベントを受け取り、別のスレッドから描画を行うには、SurfaceHolder.CallbackActivity.onResumeを実装する必要があります。Android SDK のサンプル フォルダーにある LunarLander プロジェクトを見ると、SurfaceView の適切な使用方法が示されています。Surface

コールバックは次のようになります。

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());
于 2012-07-15T11:45:15.617 に答える