繁体   English   中英

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

[英]ViewTreeObserver Listener not called after some time

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

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

我的解决方案

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM