获取控件(布局或View)宽度或高度的方法

原创 2015年11月21日 15:47:27

1.onCreate()/onCreateView()中是无法通过view.getHight()/getWidth()反法获取到控件的高度或宽度

因为此时控件的onMeasure()方法没有调用,本身还不知道自己的属性

2.解决方法(推荐两种)

1.设置addOnPreDrawListener()回调方法

        final ViewTreeObserver vto = view.getViewTreeObserver();
        vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @Override
            public void onGlobalLayout() {
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                int width = view.getWidth();
                int measuredWidth = view.getMeasuredWidth();
                ViewGroup.LayoutParams params = view.getLayoutParams();
                int  paramWidth = params.width;
                show.append("\n\n" + "width:" + view.getHeight() + "," + view.getWidth() +
                        "\n" + "measuredWidth:" + measuredWidth + "," + view.getMeasuredHeight() +
                        "\n" + "paramWidth:" + paramWidth);
            }
        });

其中veiw是你想测量的布局或控件,从结果中可以发现getWidth()和getMeasureWidth()方法是可以获取到控件的宽度,区别在getWidth获取的是屏幕中能看到的宽度,getMeasureWidth()是控件本身的自身宽度,还不懂可以看这里:http://blog.sina.com.cn/s/blog_6e519585010152s5.html(借鉴下,感谢您),通过LayoutParams在这里是获取到-1,所以不行,之后如果你想动态设置控件的宽或高可以通过以下方法来设置
ViewGroup.LayoutParams params = view.getLayoutParams();
                params.height = measuredWidth;
                view.setLayoutParams(params);
需要注意:
  1. LayoutParams是你需要设置的控件的父布局的LayoutParams.
  2. view.getViewTreeObserver().removeOnGlobalLayoutListe(this);需要调用,否则会调用多次

2.设置addOnPreDrawListener()回调

        vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

            @Override
            public boolean onPreDraw() {
                int height = view.getMeasuredHeight();
                int width = view.getMeasuredWidth();
                view.getViewTreeObserver().removeOnPreDrawListener(this);
                int width = view.getWidth();
                int measuredWidth = view.getMeasuredWidth();

                int paramWidth = params.width;
               // show.append("\n\n" + "width:" + view.getHeight() + "," + view.getWidth() +
                 //       "\n" + "measuredWidth:" + measuredWidth + "," + view.getMeasuredHeight() +
                   //     "\n" + "paramWidth:" + paramWidth);
                //ViewGroup.LayoutParams params = view.getLayoutParams();
                //params.height = measuredWidth;
                //view.setLayoutParams(params);
                return true;
            }
        });


微信小程序 获取组件数据

//wxml {{menuItem.reportType}} //js tapMainMenu: function (e) { //获取当前一级菜单标识 var index = pars...

【微信小程序教程】动态改变view标签的宽度和高度

【微信小程序教程】动态改变view标签的宽度和高度

微信小程序传值以及获取值方法

微信小程序传值以及获取值方法,传值有两种方法,对应也有获取值得方法, 1、设置id的方法标识跳转后传递的参数值; 2、通过使用data - xxxx 的方法来标识要传递的值 微信小程序设置i...
  • zgmu
  • zgmu
  • 2016年11月29日 10:39
  • 39738

微信小程序获取高度

wx.getSystemInfo({ success: function(res) { console.log(res.model) console.log(res.pixelRa...

微信小程序开发常用技巧(2)——页面view高度计算

微信小程序页面分为好几块,如果让高度完美占满整个窗口呢? 我们很多时候有这样一个需求:我们的页面分为上下两个部分或者更多,上半部分或用了固定的rpx设置了高度,我们想要剩下一部分的高度刚好占满剩余窗口...

获得 View 宽高的几种方法

- 介绍获得 View 宽高的几种方法; - 说明 View.post(Runnable) 的工作原理,但不推荐使用该方法。...
  • zhaizu
  • zhaizu
  • 2016年08月09日 09:44
  • 1100

Android 获取系统顶部状态栏高度和底部导航栏的高度

本文转载: http://www.cnblogs.com/rossoneri/p/4142962.html 获取顶部status bar 高度private int getStatusBarHei...
  • AD_118
  • AD_118
  • 2016年10月29日 15:11
  • 2010

Scrollview中嵌套ViewPager中嵌套ListView 滑动中tab固定顶部ScrollingTricks效果特效

先看效果图 怕说不清楚,特来一张图 手绘 好 现在来说说效果实现中遇到的问题 1:scrollview中嵌套viewpager中嵌套listview 出现了 listview不显示 ...

在代码写布局,设置相应的位置,同时分析一下布局中View这个控件的高度,宽度(主要用于画实线虚线)

一.先看看为什么有时候虚线画不出来 以前布局中画虚线,设置height不一样,导致有时候虚线有时候显示的出来,有时候显示不出来,今天就来分析一下为什么。 布局文件 drawable/dotted_li...

获取控件的宽度和高度的像素值的四种方法

//获取控件的宽度和高度的像素值的四种方法// public void getWidthAndHeight_1(View view) { int w = View.MeasureSpec.make...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:获取控件(布局或View)宽度或高度的方法
举报原因:
原因补充:

(最多只允许输入30个字)