zoukankan      html  css  js  c++  java
  • 【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 

  • 相关阅读:
    Java 编程规范
    Java常考面试题
    SQL 实战
    快速排序
    剑指Offer(51-67)
    剑指Offer(41-50)
    移动端图片编辑器
    css隐藏和显示table的第一列
    sweetAlert1 设置弹窗宽度,及使用自定义样式
    js获取yyyy-mm-dd hh:mm:ss格式的当前系统时间
  • 原文地址:https://www.cnblogs.com/lqminn/p/2754962.html
Copyright © 2011-2022 走看看