我需要在我的客户视图中调用requestLayout()
,但我注意到了
当视图层次结构当前处于布局传递中时,不应调用此方法({@link#
isInLayout()
}。
所以我决定使用这段代码:
if(isInLayout()) {
// request layout later
} else {
requestLayout();
}
但问题是我以后不知道如何请求布局,我可以使用addOnLayoutChangeListener
吗?
就像这样:
addOnLayoutChangeListener(new OnLayoutChangeListener() {
@Override
public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {
requestLayout();
}
});
答案 0 :(得分:1)
如果要在正在进行的布局传递完成后请求新布局,请查看ViewTreeObserver.OnPreDrawListener和PreDraw()
方法。
<强> onPreDraw 强>
boolean onPreDraw()
在即将绘制视图树时要调用的回调方法。此时,树中的所有视图都已经过测量并给出了一个框架。客户端可以使用它来调整其滚动边界,甚至可以在绘制之前请求新的布局。
还有其他方法属于ViewTreeObserver.OnPreDrawListener
界面,也可能是您正在寻找的方法。
您还可以查看属于post()
的{{1}}。 (请参阅文档here)。我相信您发布的View
将在视图上完成布局后执行。这可能更符合您的要求。另请查看已接受此Stack Overflow question的答案。