アンドロイド:SurfaceViewを使用してフォーカスを取り戻します

StackOverflow https://stackoverflow.com/questions/672325

  •  21-08-2019
  •  | 
  •  

質問

私は現在、月面着陸のサンプルで遊んで、アンドロイドとのグリップを取得しています。

私はあなたがアプリから離れて移動する場合には、下にある表面(呼び出しsurfaceDestroyed)を破壊する(例えば、通話ボタンを押す)ことがわかってきました。

それはそれを再作成することなく、表面に描画しようとすると、アプリがクラッシュします(onWindowVisibilityChangedをトリガする)バックナビゲーションます。

私はSurfaceViewの基礎となる表面を再生し、うまく実行を再開することを(他のどこか)onWindowVisibilityChangedに置くことができるいくつかのコードはありますか?

これは単純な関数呼び出しでなければなりませんが、私はAPIドキュメントで何かを見つけることができないように

それは感じています。

ありがとうございます。

役に立ちましたか?

解決 2

誤診断!アプリの自動表面を再作成しますが、それが作成される前、それに描画しようとするとそこでの呼び出しがあります。

問題を修正ます:

boolean mSurfaceExists;
...
public void surfaceDestroyed(SurfaceHolder holder) {
    mSurfaceExists = false;
    ...
}

public void surfaceCreated(SurfaceHolder holder) {
    mSurfaceExists = true;
    ...
}

protected void onWindowVisibilityChanged(int visibility) {
    // only call base if there's a surface
    if(mSurfaceExists)
        super.onWindowVisibilityChanged(visibility);
}

今ではすべてのうねりです。 (私の知る限り承知しているように、とにかく! - これは悪い習慣である場合、Java / Androidの専門家はコメントして自由に感じる)

他のヒント

「mSurfaceExists =真」のためのこのソリューションは、いずれかの私のために働いていません。 super.onWindowVisibilityChanged()が呼び出されていないため、surfaceCreated()が呼び出さ取得されていないように見えます。だから、そこには表面が作成されていないとthreas.startが呼び出されないので、それはクラッシュしません。

私は問題があると考えています。 スレッドがすでに開始されたため)(thread.start呼び出すと、エラーが発生します。 しかしsurfaceDestroyed()で、thread.joinが完了し、死ぬスレッドが発生します。そして、スレッドは、一度死んで再起動することはできません。

私はトリックがsurfacecreatedまたはユーザーがアプリケーションが(バックキー)を終了する呼び出し、(ホームキー)を一時停止していないときに完了するために、スレッドを引き起こすだけに新しいスレッドを作成することです推測しています。これは、活動にisFinishing()を呼び出すことによって確認することができます。

これが機能するかどうかわかりません。私はすぐにこれをしようとされます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top