前言

在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. 在网页中使用for (flask框架)
  2. [html] 编写html时,你有没有用过Emmet插件呢?说说它的优点及规则有哪些?
  3. 5000+图片找到你喜欢的那个TA,Python爬虫+颜值打分
  4. Ubuntu下ffmpeg 捕获屏幕和采集声卡、摄像头、麦克风声音
  5. 高性能相关----爬虫
  6. “中国十大名校”之争!
  7. 软考初级程序员含金量高吗?有答案了
  8. ARCore学习——软件准备及网站
  9. matlab如何算排列组合数,MATLAB 排列组合问题
  10. journey、voyage、trip、tour、travel的用法区别
  11. R语言小实践---云词分析
  12. android camera噪点,拍照时总是有很多噪点怎么办?方法很简单但你还真不知道
  13. python识图找图_python识别图片
  14. USB接口PCB设计
  15. 计算机网络安全-----身份认证
  16. recap 360.html,Autodesk ReCap
  17. 2022商业地产百货零售行业IT及数字化转型分析
  18. Dos下进入指定目录
  19. 2018android旗舰手机,亓纪的想法 篇五:且用且珍惜:2018年LCD屏幕旗舰手机推荐(上)...
  20. http请求 响应返回

热门文章

  1. linux新建用户组、用户
  2. 三脚架代表人生_您可以在飞机上随身携带三脚架相机吗?
  3. python怎么制作游戏修改器_Mancala (Python Edition)游戏修改器_九游手机游戏
  4. 阿里+字节工作几年,中度抑郁了
  5. java大话西游_Java设计模式_行为型_备忘录模式_大话西游之月光宝盒
  6. Getbuffer ReleaseBuffer Cstring
  7. html内联框架隐藏滚动条,Axure7.0 内联框架隐藏滚动条
  8. 工厂下单表格html页面,工厂工业企业HTML模板
  9. 中小企业贷款真的难吗?
  10. 物联网精英训练营工作日志