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

Posted

技术标签:

【中文标题】更改 LayoutParams 对象的属性后,是不是需要再次调用 setLayoutParams?【英文标题】:After changing a property on a LayoutParams object, do I need to call setLayoutParams again?更改 LayoutParams 对象的属性后,是否需要再次调用 setLayoutParams? 【发布时间】:2014-12-11 10:50:19 【问题描述】:

我有一个视图(包含一个广告),我需要在某个时间点(加载广告后)缩放以适应屏幕宽度。所以我有一个方法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 视图在其 setLayoutParams() 方法中调用 requestLayout()。相反,我认为公共字段 (params.height) 的更改不会触发布局更改。

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

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

【问题讨论】:

【参考方案1】:

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

requestLayout() 安排布局传递

setLayoutParams() 调用requestLayout() 如您所见

有时通过其他方式安排布局传递。例如,在膨胀之后,布局参数也立即膨胀,并且测量/布局消息刚刚发布到 UI 线程消息队列以供以后处理。

因此,为了安全起见,请在触摸布局参数后始终致电requestLayout()setLayoutParams() 也可以,但在就地修改参数时并不是绝对必要的。

【讨论】:

既然 LayoutParams 是用来从 child 到 parent 进行通信的,那么一旦 child 的 LayoutParams 发生变化,我们是不是应该在 parent 上调用 requestLayout 呢? @vlazzle 对子级的布局请求也会传播到父级。 哦,是的,我看到了here。谢谢@laalto! 根据用例,您可能希望在 UI 线程上执行该调用。例如myView.post myView.layoutParams = params 【参考方案2】:

Kotlin中你可以使用KTX扩展更新LayoutParams

view.updateLayoutParams  height = newValue 

【讨论】:

以上是关于更改 LayoutParams 对象的属性后,是不是需要再次调用 setLayoutParams?的主要内容,如果未能解决你的问题,请参考以下文章

Postgres Plus Advanced Server (PPAS) 9.5 是不是支持将属性更改(删除/添加)复合对象类型?

在 LinearLayout 中更改 LayoutParams 的动画

核心数据 changedValues 是不是忽略二进制数据和转换后的属性?

我如何检查属性是不是在更新前实际更改

为啥按钮只会在手动更改输入后更改对象属性?

Nativescript:TypeError:无法读取未定义的属性“LayoutParams”