2012-02-24 111 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,那么我调用该函数并重置标志。

相关问题