2012-02-24 154 views
5

使用ViewTreeObserver時遇到很大困難。所有的作品在一段不可預測的時間內都可以正常工作,然後聽衆就不再操作了。這是肯定是因爲什麼被寫在doc:返回ViewTreeObserver觀察者不保證有效期爲這一觀點的壽命 因此我重新安裝每次我改變我的觀點:ViewTreeObserver偵聽器在一段時間後未被調用

protected void shrinkToFit(final TextView t) { 
    if(vto==null||!vto.isAlive()){ 
    vto = t.getViewTreeObserver(); 
    vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
     public void onGlobalLayout() { 
      doAdjust(t); 
     } 
    }); 
    } 
} 

這裏是我如何調用它:

TextView t = (TextView) findViewById(R.id.maindesc); 

       t.setTextSize(Constants.MAINDESC_SIZE); 

       String todisp_1 = tarifreadtemp.area_desc + ":" 
         + tarifreadtemp.area_tarifuserdesc; 
       shrinkToFit(t); 
       t.setText(todisp_1); 
       t.invalidate(); 

回答

1

通常我的addOnGlobalLayoutListener監聽器添加到我的觀點之前的佈局被重新繪製或改變(當我第一次初始化的觀點或這可能發生,也許改變其佈局前)和聽者的第一件事我所做的是從視圖中移除偵聽器。

+0

這種方法意味着每次更改視圖時都會將偵聽器添加到視圖中。可以這樣做,但爲什麼Android的行爲呢?這對於我所知道的任何其他觀察者/聽衆都不會發生。 – michaelsmith 2012-02-24 10:10:15

+0

這是一個很好的問題..不幸的是,我沒有回答這個問題 – Cata 2012-02-24 11:41:24

+0

我只是意識到系統正在正確處理,儘管延遲了幾分鐘......可能只是在調試模式下的情況。將檢查這一點 – michaelsmith 2012-02-25 10:41:14

0

我遇到了類似的問題,有時onGlobalLayout沒有被調用。發生這種情況,有時在旋轉設備時重繪列表視圖。

我的解決方案

我對這個問題的解決方案如下:我注意到,無論怎樣,onScroll聽衆每次被稱爲列表視圖是重繪。所以,當我註冊onGlobalLayout監聽器時,我設置了一個全局標誌,並將所有代碼從監聽器移到一個單獨的函數中。

如果偵聽器被調用,我調用該函數並重置該標誌。

否則,每次onScroll被調用時,我檢查了標誌的狀態,如果它仍然是true,那麼我調用該函數並重置標誌。

相關問題