2015-12-10 130 views
0

簡而言之,我需要知道應用程序啓動何時完成,即何時應用程序完全被繪製並對用戶可見。當應用程序被完全繪製並可見時進行檢測

ViewTreeObserver.OnGlobalLayoutListener()有單一方法 - onGlobalLayout()。 我看到它被多次調用,但我無法檢測到每個特定調用背後的原因。通常它被稱爲2-3次,在應用程序變得可見之前。因此,我需要知道在每次啓動應用程序期間是否會調用2次或3次或X次,所以我假設每次調用onGlobalLayout()的原因都可以幫助確定這一點。

但是我不堅持使用onGlobalLayout()如果有更好的方法來完成這個任務,所以請隨時給予其他的可能性。

回答

0

你會錯誤的方向我認爲@helleye, 你應該嘗試「.post(Runnable action)」。

假設linearLayout1應該在最後被繪製,那麼你應該試試這個...

linearLayout1.post(new Runnable() { 

    @Override 
    public void run() {// will be call when linearLayout1 will be completely loaded 
     // TODO Auto-generated method stub 
     //you can write your code here 
    } 
}); 
+0

這應該是有效的,因爲.. 。它會將Runnable添加到該視圖的消息隊列的末尾,以便在繪製視圖之後執行run()方法? 有沒有辦法找到最終繪製哪個視圖? – helleye

+0

@helleye我不知道,但我們應該輕鬆地承擔最後應該繪製哪個佈局...... :-) 不應該嗎? – Rumit

+0

我不能輕易推測哪一個最終會被繪製出來:) 無論如何,我沒有看到通過選擇不同的佈局來發布它們的可運行性,因此這個解決方案最符合我的需求。 – helleye

2

是的,還有更好的辦法。你非常接近它。

view.getViewTreeObserver().addOnPreDrawListener(myListener); 

這個回調函數將在完整UI被測量和佈局後調用。此回調後,繪圖操作將立即發生。

上使用特別說明:

  • 從聽者onPreDraw方法,你必須回報true,否則繪圖操作不會發生。
  • 如果您只需要調用一次,請不要忘記從onPreDraw方法中刪除偵聽器。 view.getViewTreeObserver().removeOnPreDrawListener(myListener);否則你會不斷地爲每次平局操作調用。
+0

這個答案似乎是我的終極目標有幫助,但它並沒有真正回答這個問題,因爲我的問題包括:圖紙也是如此。然而,比較從'onPreDraw()'和最後一個'onGlobalLayout()'調用得到的時間,我幾乎相信繪圖本身在我的設備上非常慢......除非在幾天內出現更好的答案,這將是公認的,因爲它也應該對大多數人有幫助(儘管它不適合我的具體情況) – helleye

+0

好吧。我可能錯過了這個問題的要點,但正如我所說,一旦這個回調返回,屏幕上的繪圖就會發生。或者,您在視圖樹觀察者上有一個'onDrawListener',它在繪製操作後立即被調用。這可能是你正在尋找的答案 – Budius

+0

'onDrawListener'完全沒有被調用,並且@Rumit答案對我來說更好。儘管如此,我認爲這個答案應該適合大多數其他人(我的應用程序可以在嵌入式設備上運行Android),並且也很有用,並且可以清楚地描述,但我只能投票一次... – helleye

相關問題