2

画面全体を占める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);
}
4

2 に答える 2

0

結局、これが私がこの問題を回避した方法です。誰かがより良い解決策を持っているなら、ぜひここにそれを書き留めてください、そして私はあなたの答えを最良の答えとして選びます。

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    // Delay for the layout request. It must be longer than the time ICS takes to play
    // the animation where the app's screen moves up to fill the space of the Android
    // status bar.
    final int DELAY_MS = 1000; // in ms

    if (hasFocus) {
        // Send a delayed layout request to fix the problem with the toolbar
        // being half hidden after returning from onPause() on some devices 
        // with ICS.
        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                findViewById(R.id.menu_bar).requestLayout();
            }
        }, DELAY_MS);
    }
}

まず、コードを入力しましonWindowFocusChanged()た。画面をオフにするonResume()と、画面がオンに戻った直後(および画面のロックが解除される前)に呼び出されるため、アプリが実際に表示される前、つまり前にランナブルが実行されていたためです。アニメーションが表示されたので、そのような場合でも問題は発生していました。

次に、500msが短すぎたため、遅延を1秒にしました。アニメーションの再生は行われず、ツールバーはまだ半分非表示になっています。もちろん、これにより、ツールバーは、正しい位置に戻される前に、数ミリ秒間半分非表示として表示されます。

于 2012-07-31T02:09:25.873 に答える
0

この問題の詳細とより良い回避策を見つけたので、ここに新しい情報があります。

AdHubView最初に、この問題は、から派生したSamsungのクラスを使用して広告を表示しているときにのみ発生することを発見しましたRelativeLayout。そのため、問題はに関連している場合と関連していない場合がありますRelativeLayout

この広告ビューは、とツールバー( )をFrameLayout含む同じ上部に含まれています。レイアウトのトップ要素として使用したため、このトップは明示的に宣言されていません。GLSurfaceViewLinearLayoutFrameLayout<merge >

さて、より良い回避策について、私がしたことは、を非表示にAdHubViewしてonPause、で再び表示することonWindowFocusChangedです。また、でもう一度表示してみましたonResumeが、画面がオフになっていて、アプリに戻るために画面のロックを解除する必要があった場合は機能しませんでした。

以下にいくつかのコードサンプルを示します。

protected void onPause() {
    super.onPause();

    mAdView.setVisibility(AdHubView.GONE);
}

public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);

    if (hasFocus) {
        mAdView.setVisibility(AdHubView.VISIBLE);
    }
}

この回避策では、以前の回避策で行っていたように、ツールバーを強制的に上に移動する前に待つ必要がないため、ユーザーは奇妙なことに気付くことはありません。

于 2012-08-09T08:35:37.213 に答える