更改LayoutParams对象上的属性后,是否需要再次调用setLayoutParams?

时间:2014-10-16 07:05:35

标签: android layoutparams

我有一个视图(包含广告),我需要缩放以适应特定时间点(加载广告后)的屏幕宽度。所以我有一个方法setHeight(myView)来计算给定屏幕宽度的正确高度,并相应地更改视图的LayoutParams。代码的关键部分是:

LayoutParams params = myView.getLayoutParams();
int width = myView.getWidth();
if (params != null && width > 0) {
    params.height = (int) Math.round(ratio * width);
}

这似乎在很大程度上起作用,但有时视图不会缩放。如果我在底部添加以下行,似乎只能一致地工作:

myView.setLayoutParams(params);

这似乎也有意义,因为Android视图会在requestLayout()方法中调用setLayoutParams()。相反,我认为公共字段(params.height)的更改不会触发布局更改。

另一方面,我反复在网上找到简单更改参数的教程,然后再不再设置为视图。

所以,我的问题是:在更改LayoutParams的属性后立即更新布局是否正确,我需要再次调用setLayoutParams?只是更改属性只会导致布局更改在稍后的某个时间从其他地方触发布局更改?

2 个答案:

答案 0 :(得分:41)

布局参数的更改仅对下一个布局传递生效。

  • requestLayout()安排布局通行证

  • setLayoutParams()正如您所观察到的那样调用requestLayout()

  • 有时,布局传递是通过其他方式安排的。例如,在通货膨胀之后,布局参数也会被夸大,并且测量/布局消息刚刚被发布到UI线程消息队列中以供稍后处理。

因此,为了安全起见,请在触摸布局参数后立即致电requestLayout()setLayoutParams()也有效,但在原地修改params时并不是绝对必要的。

答案 1 :(得分:0)

Kotlin 中,您可以使用 KTX 扩展来更新 LayoutParams

view.updateLayoutParams { height = newValue }