view的getWidth() getHeight() 总是返回0 的几种解决方法

当我们在oncreate 调用 getwith() 与 getheigh()时返回0 的原因是我们的view 在此时还没有绘制出来,不光在oncreate .Activity生命周期中,onStart,onResume,onCreate都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。

所以一个解决方法:

就是将 getwith放到onWindowFocusChanged()中。这个onWindowFocusChanged指的是这个Activity得到或者失去焦点的时候 就会就会被调用。

另一个方法是在oncreate 注册一个viewTreeObserver的监听器,监听view的绘制情况。这是一个注册监听视图树的观察者(observer),在视图树种全局事件改变时得到通知。这个全局事件不仅还包括整个树的布局,从绘画过程开始,触摸模式的改变等。ViewTreeObserver不能够被应用程序实例化,因为它是由视图提供。

他提供了很多监听器,具体见:http://www.cnblogs.com/xingfuzzhd/archive/2013/06/25/3154674.html

我们这里用下面这个就行:

//这种可以在外层布局完成时动态加载里面的布局
        /**out_layout是img_barde,tv_title,img_author,的外层layout,在外层布局加载完成后根据img_barde,tv_title的高宽动态绘制img_author的布局*/
        ViewTreeObserver viewTreeObserver = out_layout.getViewTreeObserver();
        /**注册一个回调函数,当一个视图树将要绘制时调用这个回调函数。
            *参数 listener    将要被添加的回调函数
            *异常 IllegalStateException       如果isAlive() 返回false
            */
        viewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {

                if (!hasMeasured) {
                    FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(FrameLayout
                            .LayoutParams.MATCH_PARENT, FrameLayout.LayoutParams.WRAP_CONTENT);
                    layoutParams.setMargins(0, img_bar.getHeight() + tv_title.getHeight(), 0, 0);
                    img_author.setLayoutParams(layoutParams);
                    hasMeasured = true;
                }
                return true;
            }
        });
时间: 2024-08-05 18:36:56

view的getWidth() getHeight() 总是返回0 的几种解决方法的相关文章

WORD Application.Documents.Open函数返回null的一种解决方法

DCOM Config Setting for "Microsoft Office Word 97 - 2003 Document" 内部配置一切正常,但Application.Documents.Open函数还是返回null.下面是一个解决方法: "C:\Windows\SysWOW64\config\systemprofile\"目录下创建一个"Desktop"目录. WORD Application.Documents.Open函数返回nu

php 表单提交错误后返回数据消失问题的解决方法

本文章向码农们介绍php 表单提交错误后返回数据消失问题的解决方法,感兴趣的码农可以参考一下. 表单提交错误后返回数据消失怎么办呐,今天就来分析解决一下这个问题. 状况概述: 做填写表单信息提交的时候会碰到一个问题就是当用户填写并提交表单后,程序判断不符合要求并返回,返回之后之前填写的表单信息会被清空了的情况.如果填写的信息量少还无所谓,如果填写的信息量比较多,这会直接打击到填写信息的人的良好心情.因此解决表单提交错误返回后填写的内容消失的问题是一个提高用户体验度的迫在眉睫的问题. 对于这种问题

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序的解决方法

在win7 操作系统中SQL2008导入excel2007 出现: 未在本地计算机上注册"microsoft.ACE.oledb.12.0"提供程序 的解决方法: 出现这个原因是office 2007没有安装64位的数据驱动,下载: http://download.microsoft.com/download/7/0/3/703ffbcb-dc0c-4e19-b0da-1463960fdcdb/AccessDatabaseEngine.exe 数据引擎安装后即可.

Django链接Mysql 8.0 出现错误(1045:Access denied for user 'root'@'localhost' (using password: NO) 的一种解决方法

运行环境: Django版本2.0 ; Mysql 版本 8.0.11; 错误代码:  django.db.utils.OperationalError: (1045:Access denied for user 'root'@'localhost' (using password: NO) 这个错误看网上的说法基本都是由于 数据库的 用户名 和 密码 不正确导致的 ,下面是我在Django Setting.py里的设置: ``` DATABASES = { 'default': { 'ENGI

关于activiti-5.22.0.0不支持事务解决方法

去年在做OA的时候使用activiti-5.22.0.0做为bpm的管理引擎,不过集成进来时候,在项目即将上线的时候发现activiti这个版本不支持事务. 所以在这里给出解决方案,希望给遇到小伙伴提供一种解决方法 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=

Excel教程:数值为0不显示的三种解决方法介绍

excel表格在我们的日常办公中运用的十分广泛,有时候我们经常需要设置excel数值为0不显示.那么该如何解决呢?本文分享3种解决方法,一起来学习. 方法一:如下图所示,我们想要将excel单元格里面的0不显示出来,如右图所示. 单击"EXCEL选项-高级-此工作表的显示选项-不勾选"在具有零值的单元格中显示零".如下所示: 说明:此方法的设置是针对当前工作表所有的单元格进行设置. 方法二: 第一步:选定数值为0的单元格 1.选择需要将0不显示的单元格区域 2.Ctrl+F查

View的getWidth/getHeight与getMeasuredWidth/getMeasuredHeight的区别

某个View的显示流程是这样的: Activity.onCreate-->Activity.onStart-->Activity.onResume-->image.onMeasure-->image.onLayout-->onGlobalLayoutListener-->Activity.onWindowFocusChanged-->....-->image.onDraw onWindowFocusChanged是当activity可见时的调用的,在此之前的

未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib的解决方法

本人菜鸟一个,在编码过程中遇到的问题记录下以备忘,高手别笑.最近在做一个项目,公司的VS版本是2010,家里的VS版本是2012.把公司的项目用2012打开后再用2010打开就出现 未能解析目标框架“.NETFramework,Version=v4.0”的 mscorlib的提示,软件的界面无法显示.网上找了些解决方法,有的可能要重装VS什么的,在麻烦了. 我用VS 2010打开后先清理项目再生成项目,重新打开没有上面的提示了,界面也可以显示.

IIS7.5上的REST服务的Put操作发生HTTP Error 405.0 - Method Not Allowed 解决方法

WebDAV 是超文本传输协议 (HTTP) 的一组扩展,为 Internet 上计算机之间的编辑和文件管理提供了标准.利用这个协议用户可以通过Web进行远程的基本文件操作,如拷贝.移动.删除等.在IIS 7.0中,WebDAV是作为独立扩展模块,需要单独进行下载,而IIS 7.5中将集成WebDAV,然而WebDav把Put,Delete给咔嚓了.所以在IIS 7.5上部署的RESTful服务(WCF Data Service,WCF Rest Service,ASP.NET Web API,