前言

在activity中,经常需要获取view的width和height,但是在onCreate()获取view的width和height会得到0。view.getWidth()和view.getHeight()为0的根本原因是:控件还没有完成绘制。这种情况当我们使用动态布局(使用wrap_content或match_parent)就会出现。

一般来讲在Activity.onCreate(...)、onResume()方法中都没有办法获取到View的实际宽高。So,我们必须用一种变通的方法,等到View绘制完成后去获取width和Height。

下面有一些可行的解决方案:

1. 监听Draw/Layout事件:ViewTreeObserver

ViewTreeObserver监听很多不同的界面绘制事件。一般来说OnGlobalLayoutListener就是可以让我们获得到view的width和height的地方.下面onGlobalLayout内的代码会在View完成Layout过程后调用。

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {

@Override

public void onGlobalLayout() {

mScrollView.post(new Runnable() {

public void run() {

view.getHeight(); //height可用了

}

});

}

});

但是要注意这个方法在每次有些view的Layout发生变化的时候被调用(比如某个View被设置为Invisible),所以在得到你想要的宽高后,记得移除onGlobleLayoutListener:

在 SDK Lvl < 16时使用

public void removeGlobalOnLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)

在 SDK Lvl >= 16时使用

public void removeOnGlobalLayoutListener (ViewTreeObserver.OnGlobalLayoutListener victim)

2. 将一个runnable添加到Layout队列中:View.post()

这个解决方案是比较好的。简单地说,只要用View.post()一个runnable就可以了。runnable对象中的方法会在View的measure、layout等事件后触发,UI事件队列会按顺序处理事件。在setContentView()被调用后,事件队列中会包含一个要求重新layout的message,所以任何post到队列中的东西都会在Layout发生变化后执行。

view.post(new Runnable() {

@Override

public void run() {

view.getHeight(); //height可用

}

});

3. 重写View的onLayout方法

这个方法谨慎使用,一般用在:所要执行的代码应该作为内部逻辑,从而实现高内聚的view模块,否者这个解决方案就显得很耦合、拖拉。

view = new View(this) {

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b) {

super.onLayout(changed, l, t, r, b);

view.getHeight(); //height可用

}

};

需要注意的是onLayout方法会被调用很多次,所以要考虑好在这个方法中要做什么,或者在第一次执行后禁用掉代码。

4. 重写Activity的onWindowFocusChanged方法

如果要获取的view的width和height是固定的,那么可以直接使用:

@Override

public void onWindowFocusChanged(boolean hasFocus) {

super.onWindowFocusChanged(hasFocus);

//此处可以正常获取width、height等

}

在Activity得到或者失去焦点的时候,就会被调用。Activity初始化完毕准备显示的时候就会回调该方法。所以说,只要想做一些Activity加载完毕就马上触发的事情,都可以在这里执行。

5. 获取固定宽高

如果要获取的view的width和height是固定的,那么可以直接使用:

View.getMeasureWidth()

View.getMeasureHeight()

android中oncreate方法,Android解决在onCreate()中获取View的width、Height为0的方法相关推荐

  1. 解决在onCreate()过程中获取View的width和Height为0的4种方法

    此博客为转载,原文请看这位老铁的文章: https://www.cnblogs.com/kissazi2/p/4133927.html 很经常当我们动态创建某些View时,需要通过获取他们的width ...

  2. 如何解决在onCreate()中获取View的width和Height为0?

    当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0. view.getWidth ...

  3. goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。recover panic 协程的错误处理

    package mainimport ("fmt""time" )//goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题. f ...

  4. android.apk是木马吗,解决反编译后的安卓apk会被报毒的方法

    目前几种常用的反编译工具如ApkIDE.APKDB.Androidkiller及较早版本的ApkToolBox 等反编译某些安卓热门apk会被一些安全软件检测含有木马或恶意程序,产生误判误报. 原因是 ...

  5. android 自定义控件的宽高_巧用Handler获取View控件信息

    众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ...

  6. java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js

    [Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js 0 2015-11-30 20:00:06 IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,u ...

  7. html vbs病毒,win7系统中vbs病毒怎么解决?win7中vbs病毒的修复方法

    电脑使用久了总是会出现各种各样的问题,其中比较常见的就是系统中病毒.这不一位用户说win7旗舰版系统中vbs病毒,有些用户还不清楚VBS病毒是什么?打开多个文件夹下看到".VBS" ...

  8. python中syntaxerror_【已解决】Python中两个星号**参数去传递给函数出错:SyntaxError invalid syntax...

    python 3.4中,代码:print("type(self.config)=%s" % (type(self.config))) self.connection = pymys ...

  9. Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题

    在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: create or replace procedure getidlist isl_idlist var ...

最新文章

  1. 道家遁甲式(又名道家奇门)
  2. python培训深圳-深圳Python培训机构排名
  3. jquery对输入框内容的数字校验
  4. 为什么tomcat在eclipse中启动了,访问不了
  5. python函数名的应用、闭包和迭代器
  6. linux 配置ssh免密码登陆本机
  7. 《Windows CE嵌入式开发入门——基于Xscale架构》 第8章 调试与仿真
  8. DirectX11教程5-贴图
  9. sql2000安装失败的解决方法
  10. 一站式文本标注工具doccano(你值得拥有)
  11. Wifi攻击工具 3:图形化工具 fern-wifi-cracker
  12. 微信公共号系列---快速整合微信多端页面授权之单点登录
  13. Qsetting本地缓存PC端数据
  14. 简易酒店管理系统(c++)
  15. 一起赚美元⑥ | 创立Discourse开源论坛软件每月赚取12万美元的故事
  16. [TYVJ] P1423 GF和猫咪的玩具
  17. matlab imagesc
  18. 联通光纤宽带默认无法用ftp连接服务器,这样可以设置解决
  19. 基于WEB开发的高校学籍管理系统设计与实现
  20. 1、编写程序打开记事本、计算器等

热门文章

  1. linux cc攻击脚本,GitHub - yuanguoping/CCKiller: Linux轻量级CC攻击防御工具脚本
  2. Tendermint-2-共识算法:Tendermint-BFT详解
  3. realsense深度图像读取对齐与保存
  4. OpenGL学习笔记:使用深度缓冲(Depth Buffer)创建一个旋转的立方体
  5. 计算机怎么恢复上一步,如何一键还原,教您怎么给电脑一键还原
  6. 不懂股票的人如何炒股?中富金石给你的新手入门指南
  7. 山东的磨金石教育的剪辑课程怎么样?专业吗?如何用手机剪辑?
  8. 删除list集合中特定元素的正确姿势
  9. GAN属于计算机视觉领域嘛_【图像上色小综述】生成对抗网络的GAN法
  10. python运行速度太慢?那是你打开的方式不对