做类型网站,wordpress端口配置,一个超链接 多个网站,dw怎样做网站链接众所周知#xff0c;在Android实际开发中#xff0c;对于某些复杂多变的情况#xff0c;控件的位置摆放、大小控制并非是xml类型的layout文件完全可以搞定的。此时#xff0c;我们通常会使用Java代码来通过动态计算#xff0c;将指定的控件摆放在相应的位置#xff0c;并…众所周知在Android实际开发中对于某些复杂多变的情况控件的位置摆放、大小控制并非是xml类型的layout文件完全可以搞定的。此时我们通常会使用Java代码来通过动态计算将指定的控件摆放在相应的位置并限定其大小。同样地也需要获取某个控件的大小。 对于获取控件宽、高的方法大家可以自行谷歌或者百度大抵无非一下三种方法给相应的View控件添加ViewTreeObserver回调Override onWindowFocusChange方法在需要测量时而不是onCreate或onResume中使用MeasureSpec内部类获取宽高。对于上述第三种情况我们暂且不论。对于前二者而言有没有更简单的实现呢为何获取宽高要如此对于初学者可能会有这样的疑问为什么我们不能在onCreate()或者onResume()中直接使用上述第三种方案获取宽高呢 结论是那样的话获取来的值很可能皆为0即使实际的宽高不是0。那么这是为何呢 这其实是由Android的UI绘制流程决定的。大家不妨试着做一下实验即使是在onResume()方法后它的意义也仅仅是指Activity进入了可见的状态这并不意味着界面绘制的结束。我们可以用一个简单的带有宽高值得View来做实验观察Activity中各回调方法的调用顺序得到的结果将是这样的Activity.oncreate() → Activity.onResume() → View.onMeasure() → View.onLayout() → onGlobalLayoutListener() → Activity.onWidnowFocusChanged() → ... → View.onDraw() - ...因此如果我们在onResume()中尝试获取View宽高的话很大概率是会失败的。巧用Handler获取View控件信息这里我们开门见山地先放上代码片private 上述代码作为通用的方法将获取任意View的宽高做了封装其妙处就在‘view.post’处。 将其置于onCreate()、onResume()方法中调用均可获取到正确的宽高。OverrideLogcat中的运行结果2019-01-14 22:33:13.874 18355-18355/com.example.wenhan.helloandroid I/MainActivity: Width: 225, height: 57 2019-01-14 22:33:13.874 18355-18355/com.example.wenhan.helloandroid I/MainActivity: Width: 225, height: 57为何如此就可获取到正确的值了呢其中的玄机在于我们在View.post()中所写的语句并没有立即执行而在其真正执行的时候View的宽高已经被测量完成了那时我们再去获取宽高时就会很容易地获取到正确的值了。 通过断点Debug可以轻松地发现在Activity启动过程的调用栈中存在ActivityThread类被执行了具体按照main() - handleResumeActivity() - addView() - setView() - requestLayout() - scheduleTraversals() - 执行mTraversalRunnable异步线程 - doTraversal() - performTraversals() - ... - performMeasure() - ...的执行顺序。 在我们获取宽高的语句执行前主线程的Handler正在执行TraversalRunnable见上述方法具体实现而performMeasure也被包含其中。又因为我们获取宽高的语句要排队处于等待状态直到主线程Handler轮到执行我们的语句而此时View的宽高的测量已经结束。完整示例代码wh1990xiao2005/FetchViewSizeDemogithub.com