大家很多时候需要在Activity或者Fragment的onCreate()方法中获取声明的空间的高度或者宽度,进行位置移动或者其他操作,但是当调用 view.getHeight() 或者 view.getWidth() 获取的竟然为0。。。

其实很容易理解,在onCreate()的时候,实际上控件只是声明了,并没有绘制完成,没有attach到window上,所以导致获取的高度和宽度为0,那么该怎么解决呢?

三种方式

1、使用下面的post方式

view.post(new Runnable() {@Overridepublic void run() {int height = view.getHeight() ;int width = view.getWidth();}
});

原理:

  • View.post(Runnable) 内部会自动分两种情况处理,当 View 还没 attachedToWindow 时,会先将这些 Runnable 操作缓存下来;否则就直接通过 mAttachInfo.mHandler 将这些 Runnable 操作 post 到主线程的 MessageQueue 中等待执行。

  • 如果 View.post(Runnable) 的 Runnable 操作被缓存下来了,那么这些操作将会在 dispatchAttachedToWindow() 被回调时,通过 mAttachInfo.mHandler.post() 发送到主线程的 MessageQueue 中等待执行。

想了解更多请去查看源码。相信你可以更深层次的理解。

View.post() 中的操作执行时,View 的宽高已经计算完毕,所以可以在 Activity 的 onCreate() 里调用 View.post() 来解决获取 View 宽高为0的问题

2、使用ViewTreeObserver的方式

ViewTreeObserver vto = view.getRabbit().getViewTreeObserver();
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {public boolean onPreDraw() {if(vto.isAlive()){vto.removeOnDrawListener(this);}int height = view.getMeasuredHeight());return true;}
});

ViewTreeObserver 注册一个观察者来监听视图树,当视图树的布局、视图树的焦点、视图树将要绘制、视图树滚动等发生改变时,ViewTreeObserver都会收到通知。所以 这个方法会调用很多次,如果要使用这种方法的话,要做好规避调用多次,记得移除监听;ViewTreeObserver不能被实例化,可以调用View.getViewTreeObserver()来获得。

3、还有一种不太推荐

@Override
public void onWindowFocusChanged(boolean hasFocus) {super.onWindowFocusChanged(hasFocus);int height = view.getHeight()int width = view.getHeight();
}

这个函数的含义是:view已经初始化完毕了,宽/高已经准备好了,这个时候去获取宽高是可以成功获取的。需要注意的是 onWindowFocusChanged函数会被调用多次,当Activity的窗口得到焦点和失去焦点时均会被调用一次,如果频繁地进行onResume和onPause,那么onWindowFocusChanged也会被频繁地调用,不太适合处理一些复杂的业务逻辑

Android 在onCreate()方法中获取控件宽高值为0解决方案相关推荐

  1. Android如何在onCreate()方法中获取控件的高度和宽度

    在Android中,有时我们需要测量控件的宽度和高度进行一些运算,特别是在自适应屏幕的时候,这些计算就变得特别必要,但是,如果我们直接在onCreate,或者onStart.onResume(第一次执 ...

  2. android获取该控件在屏幕,android获取屏幕宽高与获取控件宽高(三种方法)

    1.获取屏幕宽高 方法1: int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px ...

  3. android获取屏幕宽高与获取控件宽高

    1.获取屏幕宽高 方法1: int screenWidth = getWindowManager().getDefaultDisplay().getWidth(); // 屏幕宽(像素,如:480px ...

  4. android获取控件宽和高

    Android获取控件宽高 在项目中用到了测量控件的宽和高,这个在Activity的onCreate去使用控件的getHeight()和getWidth()方法去获取是会失败的,返回的都是0.这是由于 ...

  5. android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解

    android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解 一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的 ...

  6. Asp.net 2.0 中获取控件输出的Html代码 (转)

    将Asp.net 控件的呈现html获取,在不少场合会用到,比如生成静态页时 以下代码选自 Asp.net 2.0 高级编程 转自:Asp.net 2.0 中获取控件输出的Html代码 public  ...

  7. Android动态设置控件宽高和padding

    在开发过程中我们经常需要动态设置控件的宽高和padding.以TextView为例.如下: 布局代码 TextView的默认宽高为包裹文字,添加了一个背景颜色设置参数后更直观看到效果 <?xml ...

  8. jqGrid中时间控件input的值赋给点开后的laydate控件

    可以看到上课时间的值是8点-10点 点击时间控件选择时间时,时间控件不会根据已有的时间数据显示默认值,而是显示当前时间? Q:为什么会显示当前时间,怎么解决这个问题? A: 代码如下: getTime ...

  9. python获取控件内容_python通过win32api轻松获取控件的属性值

    1.如何利用句柄操作windows窗体 首先,获得窗体的句柄  win32api.FindWindows() 第二,获得窗体中控件的id号,spy++ 第三,根据控件的ID获得控件的句柄(hwnd)  ...

最新文章

  1. Java实现的简单神经网络(基于Sigmoid激活函数)
  2. c语言输入n个数按大小输出,输入n个整数并输出,用c语言表达
  3. AccuREST Stub Runner发布
  4. 【itext学习之路】--4.给pdf增加文本水印和图片水印
  5. Linux(centos)系统各个目录的作用详解
  6. redis常用命令(基础篇)
  7. JVM性能优化之CPU负载过高
  8. ViewPager PagerAdapter未更新视图
  9. bzoj3625:[Codeforces Round #250]小朋友和二叉树
  10. python3中单引号,双引号,三个单引号 ,三个双引号的差别,以及反斜杠的用法
  11. open函数返回-1_这 68 个 Python 内置函数请收好!
  12. R语言使用lm函数构建多元回归模型(Multiple Linear Regression)、并根据模型系数写出回归方程、使用fitted函数计算出模型的拟合的y值(响应值)向量
  13. nvme 驱动详解[转]
  14. localStorage 浏览器缓存
  15. 知识图谱实战应用11-基于py2neo构建一个简单的问答功能
  16. ArcGIS对比MapInfo
  17. Ubuntu16.04 系统下的pytorch库(cpu版)安装与demo测试
  18. GNNExplainer: Generating Explanations for Graph Neural Networks
  19. java将WORD文档转换成pdf文件
  20. iOS WKWebView 点击超链接跳转至Safari浏览器

热门文章

  1. c# 判断点是否在区域内 点在区域内 在多边形内 判断
  2. 【转】01.Dicom 学习笔记-DICOM C-Store 消息服务
  3. 【转】ASP.NET内幕 - IIS处理模型
  4. 一步步编写操作系统 33 利用bios中断0x15子功能0xe820获取内存
  5. 丢失模式不联网有用吗_用眼过度,打开手机“护眼模式”真的有用吗?
  6. Callable接口-创建线程的第三种方法
  7. centos7安装telnet后/etc/xinetd.d/telnet下没有telnet
  8. PWN-PRACTICE-CTFSHOW-6
  9. matlab 填充斜线,请教一个关于柱状图的问题--填充采用斜线之类的,不能是颜色...
  10. 【CodeForces - 195D】Analyzing Polyline (思维,卡精度的处理方式)