一段时间后未调用ViewTreeObserver侦听器

时间:2012-02-24 08:36:17

标签: java android

使用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();

2 个答案:

答案 0 :(得分:1)

通常我会在重新绘制或更改布局之前将addOnGlobalLayoutListener侦听器添加到我的视图中(这可能发生在我第一次初始化视图时或者可能在更改其布局之前)和侦听器中我做的第一件事是从视图中删除监听器。

答案 1 :(得分:0)

我遇到了类似的问题,有时候没有调用onGlobalLayout。有时,当旋转设备并重新绘制列表视图时,就会发生这种情况。

我的解决方案

我对此问题的解决方案如下:我注意到无论如何,每次重绘listview时都会调用onScroll侦听器。因此,当我注册onGlobalLayout侦听器时,我设置了一个全局标志,并将所有代码从侦听器移动到一个单独的函数。

如果调用了侦听器,我调用了该函数并重置了标志。

否则,每次调用onScroll时我都检查了该标志的状态,如果它仍然为真,那么我调用该函数并重置该标志。