android中oncreate方法,Android解决在onCreate()中获取View的width、Height为0的方法
前言
在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的方法相关推荐
- 解决在onCreate()过程中获取View的width和Height为0的4种方法
此博客为转载,原文请看这位老铁的文章: https://www.cnblogs.com/kissazi2/p/4133927.html 很经常当我们动态创建某些View时,需要通过获取他们的width ...
- 如何解决在onCreate()中获取View的width和Height为0?
当我们动态创建某些View时,需要通过获取他们的width和height来确定别的view的布局,但是在onCreate()获取view的width和height会得到0. view.getWidth ...
- goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题。recover panic 协程的错误处理
package mainimport ("fmt""time" )//goroutine中使用recover,解决协程中出现panic,导致程序崩溃的问题. f ...
- android.apk是木马吗,解决反编译后的安卓apk会被报毒的方法
目前几种常用的反编译工具如ApkIDE.APKDB.Androidkiller及较早版本的ApkToolBox 等反编译某些安卓热门apk会被一些安全软件检测含有木马或恶意程序,产生误判误报. 原因是 ...
- android 自定义控件的宽高_巧用Handler获取View控件信息
众所周知,在Android实际开发中,对于某些复杂多变的情况,控件的位置摆放.大小控制并非是xml类型的layout文件完全可以搞定的.此时,我们通常会使用Java代码来通过动态计算,将指定的控件摆放 ...
- java数据存在ie中_[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js
[Java教程]解决在IE中获取数据的缓存问题,运行环境为node.js 0 2015-11-30 20:00:06 IE下默认会开启缓存策略,不管是页面还是通过ajax请求的数据都会议一个url,u ...
- html vbs病毒,win7系统中vbs病毒怎么解决?win7中vbs病毒的修复方法
电脑使用久了总是会出现各种各样的问题,其中比较常见的就是系统中病毒.这不一位用户说win7旗舰版系统中vbs病毒,有些用户还不清楚VBS病毒是什么?打开多个文件夹下看到".VBS" ...
- python中syntaxerror_【已解决】Python中两个星号**参数去传递给函数出错:SyntaxError invalid syntax...
python 3.4中,代码:print("type(self.config)=%s" % (type(self.config))) self.connection = pymys ...
- Oracle中使用Table()函数解决For循环中不写成 in (l_idlist)形式的问题
在实际PL/SQL编程中,我们要对动态取出来的一组数据,进行For循环处理,其基本程序逻辑为: create or replace procedure getidlist isl_idlist var ...
最新文章
- 道家遁甲式(又名道家奇门)
- python培训深圳-深圳Python培训机构排名
- jquery对输入框内容的数字校验
- 为什么tomcat在eclipse中启动了,访问不了
- python函数名的应用、闭包和迭代器
- linux 配置ssh免密码登陆本机
- 《Windows CE嵌入式开发入门——基于Xscale架构》 第8章 调试与仿真
- DirectX11教程5-贴图
- sql2000安装失败的解决方法
- 一站式文本标注工具doccano(你值得拥有)
- Wifi攻击工具 3:图形化工具 fern-wifi-cracker
- 微信公共号系列---快速整合微信多端页面授权之单点登录
- Qsetting本地缓存PC端数据
- 简易酒店管理系统(c++)
- 一起赚美元⑥ | 创立Discourse开源论坛软件每月赚取12万美元的故事
- [TYVJ] P1423 GF和猫咪的玩具
- matlab imagesc
- 联通光纤宽带默认无法用ftp连接服务器,这样可以设置解决
- 基于WEB开发的高校学籍管理系统设计与实现
- 1、编写程序打开记事本、计算器等
热门文章
- linux cc攻击脚本,GitHub - yuanguoping/CCKiller: Linux轻量级CC攻击防御工具脚本
- Tendermint-2-共识算法:Tendermint-BFT详解
- realsense深度图像读取对齐与保存
- OpenGL学习笔记:使用深度缓冲(Depth Buffer)创建一个旋转的立方体
- 计算机怎么恢复上一步,如何一键还原,教您怎么给电脑一键还原
- 不懂股票的人如何炒股?中富金石给你的新手入门指南
- 山东的磨金石教育的剪辑课程怎么样?专业吗?如何用手机剪辑?
- 删除list集合中特定元素的正确姿势
- GAN属于计算机视觉领域嘛_【图像上色小综述】生成对抗网络的GAN法
- python运行速度太慢?那是你打开的方式不对