【Android】UI出现前获知组件尺寸,改变布局

很多时候都需要在界面出现之前获知组件的大小,以便于进行相应的布局,在网上搜索此类方法,获知两种:

方法一:

1  ViewTreeObserver vto = ssidtext.getViewTreeObserver();
2         vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
3             public boolean onPreDraw() {
4                 int height = ssidtext.getMeasuredHeight();
5                 int width = ssidtext.getMeasuredWidth();
6                 return true;
7             }
8         });

方法二:

1      ViewTreeObserver vto = mArrowUp.getViewTreeObserver();  
2         vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {  
3             @Override  
4             public void onGlobalLayout() {  
5                mArrowUp.getViewTreeObserver().removeGlobalOnLayoutListener(this);  
6                 Log.e("Width",Integer.toString(mArrowUp.getWidth()));  
7             }  
8         });  

获得的尺寸大小返回值都是以像素为单位的,但是使用这些方法的时候,我发现很多情况下会导致很多次的调用或者根本就是无限次循环,这里的解决方案有两种:

第一种:看到了Developer上面的一段源码,这段代码上面通过计算来设置gridview每一列的宽度,但是在设置的时候,需要做出一个判断:

1 public void setItemHeight(int height) {
2     if (height == mItemHeight) {//这句是关键,避免重复调用
3            return;
4     }
5

第二种:隐藏在上面的代码中

1 mArrowUp.getViewTreeObserver().removeGlobalOnLayoutListener(this);  

试验了一下,下过很好,不再循环。

有兴趣可以看一下stackoverflow上面的一段讨论:http://stackoverflow.com/questions/4393612/when-can-i-first-measure-a-view 

原文地址:https://www.cnblogs.com/lqminn/p/2754962.html