画面全体を占めるGLSurfaceViewを含むレイアウトがあります。画面の下部に、GLSurfaceViewをオーバーレイする半透明のツールバー(LinearLayout)があります。また、私のアプリは全画面表示です(android:theme="@android:style/Theme.NoTitleBar.Fullscreen
)。
通常はすべて問題ありませんが、ICS以降、ユーザーがアプリに戻る(から戻るonPause
)たびに、OSはクイックアニメーションを再生し、Androidステータスバーが上部に表示され、アプリ画面が押し下げられた状態でアプリが起動します。次に、ステータスバーが消え、アプリの画面がその分上に移動して、通常の全画面位置に戻ります。
このアニメーションが完了すると、GLSurfaceViewはツールバーの上半分をオーバーレイし、ツールバーはGLSurfaceViewの下半分をオーバーレイします。下部に表示されているツールバーの部分は、Androidのステータスバーとまったく同じサイズのようです。
もちろん、ツールバーにGLSurfaceViewを完全に表示してオーバーレイしたいのですが、これは、アプリをから起動したときに発生しonCreate
ます。
誰かがこの問題の原因とそれを修正する方法についての考えを持っていますか?
1つの回避策を見つけましたが、それは最適とはほど遠いものです。が呼び出されinvalidate()
た後しばらくしてツールバーに投稿することで、ツールバーを正しく表示させることができます。onResume()
ただし、のinvalidate()
呼び出しが速すぎると、問題は修正されません。これは、アプリの再起動から5秒後にツールバーが正しく表示されるように、invalidate()
が5秒後に呼び出される回避策のコードです。onResume()
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
// Test to try to fix half hidden toolbar problem
View toolBar = findViewById(R.id.menu_bar);
toolBar.postDelayed(new Runnable() {
@Override
public void run() {
View toolBar = findViewById(R.id.menu_bar);
toolBar.invalidate();
}
}, 5000);
}
編集:
上記のコードでは、ツールバーが正しく表示されません。上記のコードのデバッグTextView
で行設定テキストを取り出しましたが、まったく関係のないものを更新しないと、ツールバーが表示されないことがわかりましたTextView
。
onResume
が呼び出されたときに最初にツールバーを削除し、しばらくしてから元に戻すことで、上記の不十分な回避策を機能させる別の方法を見つけました。以下のコードを参照してください。View.INVISIBLE
代わりにを使用View.GONE
すると、遅延後にツールバーが表示されないことに注意してください。
@Override
protected void onResume() {
super.onResume();
mGLSurfaceView.onResume();
// Test to try to fix half hidden toolbar problem
View toolBar = findViewById(R.id.menu_bar);
toolBar.setVisibility(View.GONE);
toolBar.postDelayed(new Runnable() {
@Override
public void run() {
View toolBar = findViewById(R.id.menu_bar);
toolBar.setVisibility(View.VISIBLE);
//mDebugText.setText("Menu bar to front.\n" + mDebugText.getText());
}
}, 5000);
}