使用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();
答案 0 :(得分:1)
通常我会在重新绘制或更改布局之前将addOnGlobalLayoutListener
侦听器添加到我的视图中(这可能发生在我第一次初始化视图时或者可能在更改其布局之前)和侦听器中我做的第一件事是从视图中删除监听器。
答案 1 :(得分:0)
我遇到了类似的问题,有时候没有调用onGlobalLayout。有时,当旋转设备并重新绘制列表视图时,就会发生这种情况。
我的解决方案
我对此问题的解决方案如下:我注意到无论如何,每次重绘listview时都会调用onScroll侦听器。因此,当我注册onGlobalLayout侦听器时,我设置了一个全局标志,并将所有代码从侦听器移动到一个单独的函数。
如果调用了侦听器,我调用了该函数并重置了标志。
否则,每次调用onScroll时我都检查了该标志的状态,如果它仍然为真,那么我调用该函数并重置该标志。