子视图的坐标什么时候生效?
When do coordinates of child views become valid?
我有一个包含很多子视图的 RelativeLayout
,我想在 activity 启动后计算其中一个(相对于父容器)的位置。
我的问题是,当我用视图填充布局时,我无法获得任何坐标,这发生在我的 activity 的 onStart
方法中。特别是,我尝试了 similar question 中提到的所有食谱,但都没有成功;所有这些方法 return 只是零。
不过,如果我稍后重复计算(即在按钮处理程序中),它们会计算出正确的位置。
所以我的假设是 onStart
不是计算位置的好地方,因为还没有准备好。但是哪个地方会更好呢?根据 the docs,onStart
是 activity 显示给用户之前的最后一次调用。我尝试将我的数学转移到 onResume
,但这没有帮助。
您可以通过这种方式确保视图具有有效坐标:
parentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// really important! elsewhere this method will be called continously
parentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// do your job
}
});
我有一个包含很多子视图的 RelativeLayout
,我想在 activity 启动后计算其中一个(相对于父容器)的位置。
我的问题是,当我用视图填充布局时,我无法获得任何坐标,这发生在我的 activity 的 onStart
方法中。特别是,我尝试了 similar question 中提到的所有食谱,但都没有成功;所有这些方法 return 只是零。
不过,如果我稍后重复计算(即在按钮处理程序中),它们会计算出正确的位置。
所以我的假设是 onStart
不是计算位置的好地方,因为还没有准备好。但是哪个地方会更好呢?根据 the docs,onStart
是 activity 显示给用户之前的最后一次调用。我尝试将我的数学转移到 onResume
,但这没有帮助。
您可以通过这种方式确保视图具有有效坐标:
parentView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// really important! elsewhere this method will be called continously
parentView.getViewTreeObserver().removeOnGlobalLayoutListener(this);
// do your job
}
});