第一件事!我不知道ViewTreeObserver.onGlobalLayoutListener.
让我问这个问题的是Android开发者文档网站上的以下通知:
下面的代码段执行以下操作:
- 获取父视图并在UI线程上发布Runnable.这可以确保父级在调用getHitRect()方法之前布局其子级.getHitRect()方法获取父级坐标中子项的命中矩形(可触摸区域).
代码片段本身是:
parentView.post(new Runnable() {
// Post in the parent's message queue to make sure the parent
// lays out its children before you call getHitRect()
@Override
public void run() {
/// do UI stuff
}
});
Run Code Online (Sandbox Code Playgroud)
(你可以看一整篇文章)
这是错误的陈述还是真的?我问,因为与使用ViewTreeObserver完成所有注册监听器/ handle-event/unregister-listener舞蹈相比,发布runnable似乎更容易,更方便:)
更新:另一个问题是为整个主题带来清晰度:如果所有这些都很好并且实际上可以发布Runnable而不是使用全局布局监听器,那么为什么我们有这个ViewTreeObserver.onGlobalLayoutListener机制呢?什么时候使用它而不是发布Runnable更好,这种方法之间有什么区别?
我读过的所有内容都说您不能在构造函数中调用getWidth()或getHeight()在上调用View,但我在中调用它们onResume()。届时是否应该绘制屏幕布局?
@Override
protected void onResume() {
super.onResume();
populateData();
}
private void populateData() {
LinearLayout test = (LinearLayout) findViewById(R.id.myview);
double widthpx = test.getWidth();
}
Run Code Online (Sandbox Code Playgroud) android android-layout activity-lifecycle android-view android-viewtreeobserver