为什么在 "getLayoutParams" 之后使用 "setLayoutParams"?

Why use "setLayoutParams" after "getLayoutParams"?

例如,如果您想以编程方式将 widthheight 的某些视图的 LayoutParams 更改为 WRAP_CONTENT,它将看起来像这样:

 final ViewGroup.LayoutParams lp = yourView.getLayoutParams();
 lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
 lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;

据我了解getLayoutParams returns Params 的参考,所以这段代码就足够了。但我经常在例子等中看到这一行之后,这一行如下:

 yourView.setLayoutParams(lp);  

我想知道这一行的意义是什么?

这仅仅是为了更好的代码可读性还是在某些情况下没有它就无法工作?

无法确保您对 getLayoutParams() 返回的 LayoutParams 所做的任何更改都能正确反映。它可以因 Android 版本而异。因此您必须调用 setLayoutParams() 以确保视图将更新这些更改。

使用它是因为 setLayoutParams() 还会触发 resolveLayoutParams()requestLayout(),这将通知视图发生了某些变化并刷新它。

否则我们无法确保新的布局参数确实更新。


查看View.setLayoutParams源代码:

public void setLayoutParams(ViewGroup.LayoutParams params) {
    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}

如果您不使用setLayoutParams(),您的布局设置将在调用View.onLayout()时生效。

这里是View.setLayoutParams()的源代码:

public void setLayoutParams(ViewGroup.LayoutParams params) {  

    if (params == null) {
        throw new NullPointerException("Layout parameters cannot be null");
    }
    mLayoutParams = params;
    resolveLayoutParams();
    if (mParent instanceof ViewGroup) {
        ((ViewGroup) mParent).onSetLayoutParams(this, params);
    }
    requestLayout();
}`

如您所见,requestLayout 将在 setLayoutParams 中调用。此视图将立即重新布局。 onLayout 也会被调用。