何时在Android

时间:2016-06-17 07:23:58

标签: android invalidation

我在自定义视图中编写了一些像bellow这样的代码。

RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) getLayoutParams();
lp.setMargins(100, 100, 0 ,0);
lp.width = 200;
lp.height = 200;

我在最后一行使用断点,并且在评估表达式窗口中发现getX()的值仍为0。

我想知道在设置布局参数后何时更新getX()的值,它应该是100。

感谢。

1 个答案:

答案 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());
}