一段时间后,ViewTreeObserver监听器未被调用

5

在使用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个回答

1

我遇到了一个类似的问题,有时候onGlobalLayout不会被调用。这种情况有时会在旋转设备并且listview被重绘时发生。

我的解决方案

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

如果监听器被调用,我就调用那个函数并重置标志。

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


1
通常我会在布局被重新绘制或更改之前(这可能发生在我首次初始化视图或更改其布局之前)向我的视图添加addOnGlobalLayoutListener监听器,并且在监听器中,我做的第一件事就是从视图中删除该监听器。

这种方法意味着每次更改视图时都要将监听器添加到视图中。虽然可以这样做,但为什么Android会表现得像这样呢?我所知道的其他观察者/监听器都不会发生这种情况。 - michaelsmith
这是一个好问题..不幸的是我没有答案。 - Cata
我刚刚意识到系统正在正确处理,尽管有几分钟的延迟...可能只是在调试模式下才会出现这种情况。我会检查一下。 - michaelsmith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接