1.概要:

    Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的
2.问题提出:
    如果开发一些依赖于UI控件的宽和高的功能,开发者可能会用到View的getHeight()和getWidth()方法。试图在Activity的
onCreate()方法中获取控件的宽和高。遗憾的是如果开发者在onCreate()方法中调用上述方法,会发现返回值都是0.
3.解释问题原因:
    当onCreate()方法被调用时,会通过LayoutInflater将XML布局文件填充到ContentView。填充过程只包括创建试图,却不包括设置其大小。
那么试图的大小事在何时指定的呢?
    Android开发文档的解释如下所示:
    绘制布局由两个遍历过程组成:测量过程和布局过程。测量过程由 measure(int, int) 方法完成,该方法从上到下遍历视图
树。在递归遍历过程中,每个视图都会向下层传递尺寸和规格。当measure 方法遍历结束时,每个视图都保存了各自的尺寸信息。第
二个过程由 layout(int, int, int, int) 方法完成,该方法也是由上而下遍历视图树,在遍历过程中,每个父视图通过测量过程的结果定位
所有子视图的位置信息。
4.结论如下:
    只有在整个布局绘制完毕后,视图才能得到自身的高和宽,这个过程发生在onCreate()方法之后,因此,在此之前调用getHeight()和getWidth()
方法返回的结果都是0.
5.解决办法:
    在UI线程当中去获取, 这就要涉及一个方法post()
代码:

 public class MainActivity extends Activity {
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn = (Button) findViewById(R.id.btn);
System.out.println("Button的btn.getWidth()是-->" + btn.getWidth()
+ " btn.getHeight()是-->>" + btn.getHeight()
+ " btn.getMeasuredWidth()" + btn.getMeasuredWidth()
+ " " + btn.getMeasuredHeight());
btn.post(new Runnable() {
@Override
public void run() {
System.out.println("Button的btn.getWidth()是-->" + btn.getWidth()
+ " btn.getHeight()是-->>" + btn.getHeight()
+ " btn.getMeasuredWidth()" + btn.getMeasuredWidth()
+ " " + btn.getMeasuredHeight());
}
});
} }
 
打印结果:
    可以看到子啊post方法后就获取到View的值了
    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAjYAAABjCAIAAAAHCN0PAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAVm0lEQVR4nO2dX2wbR37Hf5szevEdmhwsye85UJRJ7VMfDGGZk//Edrpy29CJ6jw6cXy7/oeQRc93Cc6tCESIHRtouWfJNVUHFz/qz9lMcOL6nJwTyaEQuG8GRcoiffeWB5HupT2kbnE4Th92l7skZ6m/lsbW94MBzJ2dmd9vZn47v5nZsVb605/+RAAAAIB4bLldkjZaBwAAAICD9Ocq22gdAAAAAA5bGDwUAAAAIdkCDwUAAEBMntloBQAAAAA+3/mnf05stA71zOknK397sL12aVxiPTu/t5EaPdmUS6XvbdvmjZkzb7Z3BjZKH7A+oN/BU4FwG30PKpQjk5FqXd7Mx/+RgqdfVTdWqyeZyaPvxb+qj+rZU3z5RQxWTzfod/A08AxjZIWb16XvvueGkwWq3VqnUDAulUvFtjNfRNSb1yOXysSY+Qll/veQyhixsnGpQIzRpSvSd68Y661bq2CetBrtiuFpRkt/YmVj13v6TV7Gm9el7/rcWvQuY1S6E9l1p+Q0ne7+bgicTlf6uwJr2whOrVspvPQgXhcTK+hOBe3uXuQB8e/3+kZbdosJ1e/+9XqKjcE8+V6dSqJp6NiVuOPSsizkGUZkhQOHWLpbuXicPTrLHp3N0IR+07nFCRVj9w1zSZHLCPmfXDnySeHIs4PSK7PEiG7eGNzRkX52UHp2UHr2SvwnBZMRndIzby1dpccRGgWpQ/1az+7iIz1mNeOj48m3dl871U6MiLXHPj+bOsAr58AhdrHDV/m6u5xg/ssX8jsvBuzLHdHuLy769Rd1Zx6dZbWQ7l5FxQcjlyqN8aUvI69Q5tFZ9qifzn1ZWn0Li9fFxHak0t3KxeOpA6QOHU/2dGeGdrQswb/fF+/iVtUUpt83rzGoQ/1aD42dmiNGxOb0CVLe2hVbD02WFhy7EnRcWq6FPFNlVAuMESPnd0d4P6Ob16Wtg/pNRtU5feugtDVlVK3fV+JfzfZtHZS2Dkpbr5u+kYyqFWOPFTMYuVShKqPil5Gtg5E9qbrIKqMqUc/ua7+IZr/9ObsRlgMV/ZNQ9mQk9e3P2bc/Z/d2K0dDqq0bWYVIWwelU3PkJ91XEDdYFRyU9nxpnKoroT47t5pERFRl5ikrWSU/S1S1W89pwCZBW6+bjIj5Nx0j+uS6j/Jz6Q/D0f1ujPo34ZHzX5Y49SKiWsmD0tZBKTrr9vLyQlvst8cP/+qKp3MZVRllZuUbUbXKqNoVDc9OrqTkpiBcF3ufDiJyyuRkX6zfvdI5Xez3HInW75vZGIioQ57Nm1VGl6Zy4Q67YbnG4EZag6cV3FFR35PSb/qNtMw8ZZU2Z6W3LYoriDOwCDkuLddC6Nv/Y7VwY5RowA5H79mRF4a0G3aCzNGhpJ3462TPaMab1ycyc3RAufC1c3fALurGKJGV8p5GtSz3tJ7bRUcT7ei9jLfAe7cVR6XM0QEiW5P68ptU4gtqDh7dLgw5hX+d7PHWt0XdrZh7Ws+Q0nO76FG1oQGbGsH5zVX+wpCv8jdGqdZWtdZrVcHGULww1FTCksONUaJas9dXsK6yKw/idXH902EL8svest9d6X5dzH24xOv3zWsM97Se28ULQ9qNr5M9oxn7effLfi9jCbp3W/GMb04t7mnkasIbab0tbI2QXEHcgUXIcWm5FrKl6tmrZqR8oGdPthGR+fb70unX2C+67NVW1U5AtfRVz2/yi7yfzu26ZrRRlYjaYqldkeR92tdFjJQPfqRWiagr+ub0fNU5HPHVVOf3p6yf2vWoWiU11RHZk+38bSRQr4Z2/cexKhGRaryWfmmudCIS4KrkJ6iB382NhV7L7iOqEp14NTlxnapEv5sb+6o88/3347Wt/KGHsZNtvGq2BUPl+VJHLhQ+PJufZOG6hvJq7hW0L5p5M5+u3eIpbzUCR/n5MoVCgcb2L3vTlC7/e+fPytzqEpHygc5SFbNEgR8+NF5Kxe/W3cqeJF5km32xL8r++CPjpZT003Dmj1G1wUIYzzCWi3Bd7H06Hhov3VkkO/n3e006+Xcx9+EiwfqdG7lJjKFKdKKX/jIVf/M1xiqDjKjkk/13lcFDv+qzonbussvZF5IPpaSfEhHRm68xSxO/kdYyvBNtVG1LfdpFpSxH0F9zBxYRx6XGai5qIXV/XaJK9hsqItV4VdtXKbFgwFrD1lLZ6Znnt1d4Q2R9jLVDYq1AHUF1Ze7cVfxMCRDRrY91S+gLSvaz2qLVk8VVqSaCpxJfUBN1hTvlvNAm79x1zdLHrZCPICIy8/LBY7GuvJ4sU1eXR6hH24ZauBXhlclv+ZqOrFVTEwVOHGMniG59LE3uYEYX0X1938MzTvNK/XfME6+oxIhti332bqyhLox4kW7hZiw19qrGPmtzt78YEZE5R+ETHp1Xg2hd7ApaNLsjhN/vnsKX8XDV7gjT79zITWEMVkwwNfFq9ECQHlSI/LJXjB9PyRPvZg+Q1RFOOcHUf7+bIiJ6aOy7YbBgjPyf94ZKcQU9oEbDqBUl2Li0bAtxT/RZncGq9u9bhZHwtgBjxChXLBNjNHy175dOY7EqUXmeMWLMfPuc9PacT2QwGs5Pugc58vLBYKMgRvUK1EaB+nMdDxYouK2WZeRC1j4oMnwnd6gz4KeSn6AH2chzNbUZ/bDz8Owd+0zOrTvxu1bKYDQ8dfFW8yETjiA1SPF3KLyf0cuh3C/zcmCbJz25dflh5+HZgmnHz6V/WbvFbU9PRq/yjFGgnWYrjUdlqD3YqCozf13WWMWWeHeq87lz0nPnpF93sf/qIk7VlhAeZCPPnetjh7InnDq+HKKifUxonoUOrqBMThCuiz2Cqk6/+GXn9nuzdL8u5hqDeP2+2Y2B0f6gWvvNz14lCkX325qPOH1tvn1Ov1VL4BoDb6RtqJSPIJ+BRcRxabkW4v6/qE8/lv6+QFSQ3rWuQ5lvuogRnXhR/sFV6V2inb3JN6bjz38c/OYVldpjZ9ql58/HiWhnb/FWFzEiXqT6dmjQirEjiR7MRPoLM1TQA+9EJ8/3fUT0kVUm0d3pzuenrbTa+Cte71oqVmwP/G8f9n3UkTxXsFPu7C3eaudLbyHInQJY/7THroQitp4h7Q07Xk0eSv/gfO0vwWvj76T286tJRLQzdJARvdAmk+1hzfj5vo+srOdHiJRzx7In2mNnSHr+vF3gzo6R/g/D37wVay7z1sfSu2WiD8PfvBWM1ytPRPt2aP1zRUbuTOrTuZE3dqQa5iOffpw++FZq/339+fN9dsnO5IuRuo+oIf0iVIwDV+N3O5LfvJP1tuELwfCNq5bZKOeOxVY/axawi+sEXY3fJdrfUbylcLPz+71Z+qd+XexjYCRUv29aY2gz9l8duUsjz5cz37yi2sMmRbqOZTnZPc/7zg7l7nRnrI0lu4hopP/8iJXujUPM0ooz0kbmD1yN3yV7WHb6kaen38Ai3ri0XAuR/vA/a7IQXwvu6wcenrGepU9njIASe4GIHhoHrsb/g4hCmT/83br8B96HxoFs8Nb6yFo55j98kO77WWo//9KK6aMo+9cuN+r3M5G/ujPjKUR5/1j2RBttOja2i1clHf2+1jwZz/uTwqL2uWyk/xTHRW0s9/VtaWteo7x/LHtc+Af49zOR43TtN9bs+L7+8sMzv1HwhwNasrFdvEbS0e9rw5P2vD8prLl9Sg+/hYsCAAAgIvhL5wAAAARly198Z6NVAAAAAHhsmfn9nzdaBwAAAICDxBjeRQEAABARvIsCAAAgKHBRAAAABAUuCgAAgKDARQEAABAUuCgAAACCAhcFAABAUFbuoswJSUpIUkI311AdAAAAwGGFLqo0HemjDEsw9joNTpfWVicAAACAVuyiJnNypl8lIgpF5dzkWmoEAAAAENFavItSw5THXh8AAIA1B8clAAAACMrqXZSZpzC+WAkAAGDNWaGLOijTfIWIiCrzJB9cQ4UAAAAAixW6qEA4PDYkSQlJGhoLh/FdagAAAGsPPsYBAABAUHBcAgAAgKDARQEAABAUuCgAAACCAhcFAABAUOCiAAAACApcFAAAAEGBiwIAACAocFEAAAAEBS4KAACAoMBFAQAAEBTxXFRB1wveS8OobJguTwOVUuNHkQsmvu8FXGAhQGC2bLQCjZTKlCOTQvb3PczZeJyCsX587mPFTB5JxGfqo5S9RbUXf/wXWMBCgLi4qyhzQpISbqhbyqwPBcOolIodZ7K9qjkRMSpEZKYpwyz/VDGMAhGRcVmSLhvrrlwLTN1qtMsGuc0YsRd/FSOS0LlzUnNCknxuLXqXiErTkci0M/0t6O7vxVEOP4Y/Tm9crqt4aTpSs6UG3RpSrlaoWMZAVNClhNV3tmEs8ij5W0iNRY2Bi2gW0oxjCY1Ve6otxNQTdSqJpqFjbAIMaxbMQ2ZcSZbtn9qAlmH+lJPKeNN9buTSyWs0oGjjCg0QDSjJMsuMK8kpjQbIDnbhGW04uVSVHgfNgvKaMlX0JtC8l/4kh51G5inv3uXQ0EH+/dVUsqeXl0k5qQzw8yaHSamvcnFKUXiN0JxydYhnDN4WXjs1+MbQqnxhLMTHbFwLyWvkUeDpt5C8pgwrWr7ptzDYxrbxwxpjjPm/i9oeVr1Oz5obWt6+oEtD8Zlcnz1NnjB9I21/2zy/jkR4EyVl77VUf5YlWEaWg2U93Z2N9aZYgrEEK+5VtG53u682SbenqDzpLQRxsCe/UmTa0OtKqM/uV00iIlO3kpXzOet6gjdJdAS5ef3LTE/4KF9Ij8hRz+6nGpVHBv2mybWSE5KUkPpyLduhBe2x7OnDY0MNtSYq6GNyMbuUfaGlp1wOQhqDr5Je6a0txCudmo2htXRxLMTHbIoLZK/VQqnkQtp06r4pLGS7nJs1icj4PCdvb1TSK92N9K603EFVj1zWTb+B2l4JRYyCld42M64gzrhks4HDGhE1rqKotmSpOXaP0/PMR5a6ispoA54ZpeMhM+POksg7gfI47cy4puUz3gKLU7W5RkYbILI1qS+fM5/lCWrGo1ty2Cm8nFS89W1RdysmrynDijJV9KhqFeiZFzQ0wkDr6Yav8pnxpplm6wo2UlzNXDUzbi9z7bKmNGft65pNcUpptiVuytUhnjHUP0e2IL/sthS+hbjS/YzBfykglIVwI+tWUU78prCQvKZMFZPDWqacVMYz9nDhlz2fsTJ7tyXcZW5eI1cT3kDtbXZrgOUK4o5LIgxrTasoJXmasQRjiQyNrsXrqEI6t/darJ2IiNpj1/bm0gVH0G6ViCgU1Rbma8lnbnfW5nHRkErtsWvbB3l76FrmZIyIiNTU6/JYvsUmO19QA6X8mPx6yvLescNJxYmcWYjbU4Ch+MzCmO/Eqj0oL8yXyjlZPky5SX9l6gSp/RmtRVIiIi3Tz1d+foHkjqaZZl2akrOhzw1H6DC71lEskXdG5pnacCMd1H7GPPPi4sLISE7O2GZjz60CvVlr+euN5KZcNYIZgyXIeo5OLzs7V7pdTR9j4CKUhXAjA71nZet5H80pzkpi01gIxfZQ31BcdnaG/LKXyoN9CUlKSJ233RMtarcctz56PjqiOZq0qtTpbKydKJTK9ga4gvjjkhjDmt+JPjX1uhYplyi0rqd6lL32Gt+c0K2YQG82u54aeAh0yMrea0vfc5jMydGTsXBOv7hA4fBjVW0pBGInWYzInJDS3SwVIirokfIZp3mlvi9M+5xkeyybiDVl50bWMPWhscOnWbbdvlb2nlGJiNSoPDhfIbXdm1gNb0/XLlqmFJflGsPaZn88rKuF8CLVVIKliIjIuKwHl2RL4rLsLg6lMq9H1RCVyv7ZK8aR23ImkVXJ6h03L0ukrASRMYNCLTpiSXq2cNobPqz5vosyZ0cch5abrxARGZf7RrwpbAdo6t4zSw2Roajscb+TOTkaWqGixQUKd9Su3F114/Oce/qIqxIPaze2liYQPpz73N7qNb9wDuCGovLti/x5XKMgNUzxOIVVooNybiQnB32eq0D4sLUHTURUSC/enj4Et1Ou3GRX24NNCc30gkZlW2JtkZruZqybVjZFLU1HpEQfvZ6NOXVUdyc9kyyr7s7+NRFVjDEKq74pV49oxsCjRfZ6+NJb4CNdKAvxi6zdGpPPbEILUUOe9Y9fdufdjPF5bbQwdf6hOJ+BugGeIJ9xSYxhrX7LsmkP3d7uJBogZSqpeeJr6b27h82R3ncSVqQTo2WsbeIBz9akq0DDuY5ictjefrU2f5PDi0v3FeTc8m6tunqOa+5Oro9KzdV0N+7d3WFHqB1s/T3trCmelw0NZdqXw0nWpLzfNm7z3n1m3D6Z09xWK6GcVNxt/To8rZepS+ypuG/KVSCgMTQL8hhGQ3a+hTRLb2EM3MfQFieIhfiYjVvN+ltPuYXUnovxjOeW/a6oObubd7imQ53ZuFo1D9TuM1hf95aCvOPShg9rjDFi4uA9LjGVtH/V9+h6sG6nUVfFokeKM1rTC2fvdKHZeQAOG2sMq5IOC1kXnozh4kmBc+hcYowtsvraJBR0adRaoTpvF8WmNB05Qs6esuctAlgDNtYY1kg6LOQx8qQNF08KdUZLRERwUQAAAARFvD8jCwAAABARXBQAAABhgYsCAAAgKHBRAAAABAUuCgAAgKDARQEAABAUuCgAAACCAhcFAABAUOCiAAAACApcFAAAAEGpd1EFnff9QCIio/57yZ5PC0sNWYwlfll5yTgFNv79+TUXBAAAQCjqP2kYisqjF83exs84GpelMbnI6v8GZe3zg4umXA2l6YhdYEGXJkzWrz4mQQAAAESjYaNPjcru579sCvqYzPFGHJaecskUF8j+BFkolVxIm49NEAAAANFofBeldmszC0VvTKlM8sIRa0/P+9nE2gc6a5F+KVdD53Yay5eIiAp6fMH+rOTjEAQAAEA0eMcl7E/52hQXRkZycibBWCJDo/YLoUBvliUYq4/kplwlgd6zsuULR3PK9lYqAQAAeMpY0ok+Ze8ZlYhIjcr2OsaDGt6+xJQrQ03ZvjB7mOSg8+mwxyAIAACAWPBc1Pag90rdnaTcpHNlOQlTr52jqxhjFFZ9U64ZpenImHxmHQQBAAAQhMav7poTUrqbpUJ1iUrTkc7bM0REcsY+U1cxIkPxGaKG7yJzUq4Ot8DtSXYy1kolAAAATxcNLsrUE+loovHQOQAAALD+NPzX3XTOfscDAAAAbDCNG30AAACAIOBv9AEAABAUuCgAAACCAhcFAABAUOCiAAAACApcFAAAAEGBiwIAACAocFEAAAAEBS4KAACAoMBFAQAAEBS4KAAAAIICFwUAAEBQ4KIAAAAIClwUAAAAQYGLAgAAIChwUQAAAAQFLgoAAICgwEUBAAAQlP8HPyqSpcWhWfAAAAAASUVORK5CYII=" alt="" width="557" height="98" />
 
其实post方法是子线程访问UI线程的方法,这还提供了其他方法访问主线程,如果你想在
子线程当中改变UI线程的界面就可以用以下方法
    相关知识参考地址:http://stackoverflow.com/questions/13840007/what-exactly-does-the-post-method-do
  • Activity.runOnUiThread(Runnable)
  • View.post(Runnable)
  • View.postDelayed(Runnable,long)
  • Handler

HackThirteen 在onCreate()方法中获取View的宽度和高度的更多相关文章

  1. 如何在onCreate方法中获取视图的宽度和高度

    你可以通过视图的getWidth()和getHeight()来获取视图的宽度和高度. 但是,可能会让你失望的是,如果你直接在onCreate方法内调用这两个函数,你会的到0. 为什么呢? 这是因为,当 ...

  2. Android 开发 Activity里获取View的宽度和高度 转载

    原文地址:https://blog.csdn.net/chenbaige/article/details/77991594 前言: 可能很多情况下,我们都会有在activity中获取view 的尺寸大 ...

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

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

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

    最近在看Android底层代码的view绘制原理的时候讲到一个很有意思的事情,也是我几年前刚开始学习Android开发的时候比较纳闷的一个问题,如果你不理解Android的底层绘制,请看我之前一片文章 ...

  5. 在js中获取上传图片的宽度和高度

    Html: <input type="file" id="MapUploadTd" onchange="getMapPictureSize(th ...

  6. Android查缺补漏(View篇)--在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0?

    在 Activity 的 onCreate() 方法中为什么获取 View 的宽和高为0 ? @Override protected void onCreate(Bundle savedInstanc ...

  7. 如何在onCreate中获取View的高度和宽度

    如何在onCreate中获取View的高度和宽度 原文链接:http://mp.weixin.qq.com/s?__biz=MzAwODE1NTI2MQ==&mid=2247483676&am ...

  8. Activity中获取view的高度和宽度为0的原因以及解决方案

    在activity中可以调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetMeasuredHeight()来获得 ...

  9. android应用程序中获取view 的位置

    1. 相对位置: getLeft() , getRight(), getTop(), getBottom() 在Android中可以把left相当于X轴值, top相当于Y轴值, 通过这两个值Andr ...

随机推荐

  1. vs2003属性窗口空白的问题

    一个困扰很久的问题一直没有解决,因为vs的属性窗口没显示不方便修改mfc程序的id和属性等等,但是可以直接在代码里修改.问题始终是问题,最近准备画时间解决之,上网差资料搜索办法,一帖说是win7的问题 ...

  2. Studio 3T 如何使用 Query Builder 查询数据

    Studio 3T 是一款对 MongoDB 进行数据操作的可视化工具. 在 Studio 3T 中,我们可以借助 Query Builder 的 Drag & Drop 来构建查询条件. 具 ...

  3. Composer安装使用

    Composer 是 PHP5.3以上 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. 1.下载 2.安装成功 3.配置地址 4.安装代码库 镜像 配置json

  4. tomcat 1字节的UTF-8序列的字节1无效

    微信支付时, 命名返回支付成功, 但是成功后却返回如下的错误, 在测试环境都是没有任何问题, 到客户现场后, 可能客户现场使用的4G网络, 用微信支付时一直报这样的错误 错误现象: com.sun.o ...

  5. Linux学习笔记 -- 系统目录结构

    以root用户登录系统后,在当前命令窗口下输入命令: ls / 我们可以看到目录结构类似下图: 树状目录结构可以表示为: 解析: /bin:bin是Binary的缩写, 这个目录存放着最经常使用的命令 ...

  6. ubuntu安装nginx踩坑

    ubuntu安装nginx 安装nginx tar -zxvf nginx-1.15.5.tar.gz -C /usr/local/src 解压 cd /usr/local/src/nginx-1.1 ...

  7. 生成signature

    签名规则说明 1. 将参数先按键值排序(只做一级排序),进行key和value的拼接 2. 拼接完后,在最后面再拼接上分配的 appSecret 然后用sha1对拼接串加密 签名示例 假如传入参数: ...

  8. flask系列五之flask_script

    1.一个简单的例子 在工程里面新建一个Python文件命名为manage.py (1)安装flask_script包,然后引入 from flask_script import Manager fro ...

  9. Spring AOP 中pointcut expression表达式解析及配置

    Pointcut是指那些方法需要被执行”AOP”,是由”Pointcut Expression”来描述的. Pointcut可以有下列方式来定义或者通过&& || 和!的方式进行组合. ...

  10. Halcon学习之文本操作

    1.          新建文本文件open_file ( : : FileName, FileType : FileHandle ) 创建 ( 'output' or 'append' )或者打开  ...