我在自定义视图中编写了一些像bellow这样的代码。
RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams();
lp.setMargins(100, 100, 0 ,0);
lp.width = 200;
lp.height = 200;
我在最后一行使用断点,并且在评估表达式窗口中发现getX()的值仍为0。
我想知道在设置布局参数后何时更新getX()的值,它应该是100。
感谢。
答案 0 :(得分:2)
为子视图设置LayoutParams
时,其父级将再次测量阶段和布局阶段。
您的代码setLayoutParams()
将添加到MessageQueue中以执行。你在这里使用断点不会看到任何东西。
要获得新的LayoutParams
,您应该发布这样的消息
yourView.post(new Runnable() {
@Override
public void run() {
v.getX();
}
});
另一种方式:
yourView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// get your view size here
}
});
如果您想查看视图何时更新LayoutParams,请在自定义视图的layout()
方法中插入日志
@Override
public void layout(int l, int t, int r, int b) {
Log.d("alex.hong", "before X = " + getX());
super.layout(l, t, r, b);
Log.d("alex.hong", "current X = " + getX());
}