2012-07-26 25 views
2

我有一個佈局,其中包括一個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); 
} 
+1

我希望這個評論更有幫助,但是......我也有這個問題。我發現解決這個問題的唯一方法是重構我的應用程序,使其在'SurfaceView'處於活動狀態時不會隱藏標題欄。我真的很想看到這個問題的解決方案。 – Eric 2012-07-26 03:10:50

回答

0

我發現了關於這個問題的更多細節和更好的解決方法,所以這裏是新的信息。

首先,我發現,當我使用三星的AdHubView類,這是從RelativeLayout衍生出廣告的問題只發生,所以這個問題可能會或可能不會涉及到RelativeLayout

此廣告視圖包含在同一頂部FrameLayout中,其中還包括GLSurfaceView和工具欄(LinearLayout)。由於我使用<merge >作爲我的佈局的頂層元素,因此未列出此頂部FrameLayout

現在談談更好的解決辦法,我就是這樣做是藏在的AdHubViewonWindowFocusChanged再次顯示。我也嘗試在onResume中再次展示它,但在屏幕關閉的情況下無法工作,我不得不解鎖屏幕以返回到應用程序。

這裏有一些代碼示例:

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

    mAdView.setVisibility(AdHubView.GONE); 
} 

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

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

有了這個解決辦法,我不需要強迫工具欄頂端之前等待了,因爲我是在我以前的解決方法做,使用戶永遠不會注意到任何奇怪的事情。

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()被稱爲屏幕開啓後右後衛(和之前的屏幕解鎖),因此可運行正在前執行應用程序實際上是顯示的,因此,在顯示動畫之前,所以在這種情況下問題仍然存在。

其次,我把延遲1秒,因爲500毫秒太短。動畫沒有完成播放,工具欄仍然隱藏了一半。當然,這會導致工具欄在放回正確位置之前顯示爲半隱藏幾毫秒。

相關問題