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 ...
最新文章
- 在网页中使用for (flask框架)
- [html] 编写html时,你有没有用过Emmet插件呢?说说它的优点及规则有哪些?
- 5000+图片找到你喜欢的那个TA,Python爬虫+颜值打分
- Ubuntu下ffmpeg 捕获屏幕和采集声卡、摄像头、麦克风声音
- 高性能相关----爬虫
- “中国十大名校”之争!
- 软考初级程序员含金量高吗?有答案了
- ARCore学习——软件准备及网站
- matlab如何算排列组合数,MATLAB 排列组合问题
- journey、voyage、trip、tour、travel的用法区别
- R语言小实践---云词分析
- android camera噪点,拍照时总是有很多噪点怎么办?方法很简单但你还真不知道
- python识图找图_python识别图片
- USB接口PCB设计
- 计算机网络安全-----身份认证
- recap 360.html,Autodesk ReCap
- 2022商业地产百货零售行业IT及数字化转型分析
- Dos下进入指定目录
- 2018android旗舰手机,亓纪的想法 篇五:且用且珍惜:2018年LCD屏幕旗舰手机推荐(上)...
- http请求 响应返回
热门文章
- linux新建用户组、用户
- 三脚架代表人生_您可以在飞机上随身携带三脚架相机吗?
- python怎么制作游戏修改器_Mancala (Python Edition)游戏修改器_九游手机游戏
- 阿里+字节工作几年,中度抑郁了
- java大话西游_Java设计模式_行为型_备忘录模式_大话西游之月光宝盒
- Getbuffer ReleaseBuffer Cstring
- html内联框架隐藏滚动条,Axure7.0 内联框架隐藏滚动条
- 工厂下单表格html页面,工厂工业企业HTML模板
- 中小企业贷款真的难吗?
- 物联网精英训练营工作日志