【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