我有一個佈局,其中包括一個GLSurfaceView佔用整個屏幕。在屏幕的底部,我有一個覆蓋GLSurfaceView的半透明工具欄(LinearLayout)。 此外,我的應用程序是全屏(android:theme="@android:style/Theme.NoTitleBar.Fullscreen
)。從onPause返回時的佈局顯示錯誤
通常情況下,一切都很好,但首先是ICS,每當用戶回來的應用程序(從返回),操作系統扮演一個快速的動畫,其中應用與Android狀態欄顯示在頂部和啓動應用程序屏幕被推下。然後狀態欄消失,應用程序的屏幕向上移動以達到其正常的全屏位置。
當這個動畫完成時,GLSurfaceView最終覆蓋工具欄的上半部分,工具欄覆蓋GLSurfaceView的下半部分。它看起來像在底部顯示的工具欄的一部分是Android狀態欄的大小。
當然,我希望工具欄能夠完整地顯示和覆蓋GLSurfaceView,這是從onCreate
開始的所有應用程序啓動時發生的情況。
有人有什麼原因導致這個問題,以及如何解決它的想法?
我發現了一種解決方法,但它遠非最佳。 在調用onResume()
之後的一段時間,我可以通過將invalidate()
發佈到工具欄上來正確顯示工具欄。但是如果invalidate()
調用得太快,問題就不會得到解決。 以下是在onResume()
之後5秒鐘調用invalidate()
的解決方法的代碼,導致在重新啓動應用程序後5秒正確顯示工具欄。
@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);
}
我希望這個評論更有幫助,但是......我也有這個問題。我發現解決這個問題的唯一方法是重構我的應用程序,使其在'SurfaceView'處於活動狀態時不會隱藏標題欄。我真的很想看到這個問題的解決方案。 – Eric 2012-07-26 03:10:50