2016-02-19 133 views
6

例如,如果你想为这两个widthheight programmaticaly一些观点OT变化LayoutParamsWRAP_CONTENT,它看起来somethong这样的:为什么我们使用setLayoutParams?

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

正如我undestood为PARAMS getLayoutParams回报基准,所以这段代码会但我经常在例子等中看到,在此行后面,有一条如下:

yourView.setLayoutParams(lp); 

我想知道这条线的重点是什么。这只是为了更好的代码可读性,还是有些情况下,如果没有它,它将无法正常工作?

+0

我投票可读性。虽然,我从来没有见过这些例子,现有的视图必须动态调整大小。我通常会将视图动态添加到内容视图中。在这些情况下,需要setLayoutParams –

回答

4

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(); 
} 
+0

所以基本上我们只有在视图已经被绘制的情况下才需要它,我们需要在之后改变它? –

+0

是的。在运行时更改现有视图参数时调用它 – sakiM

0

无法确保您对由getLayoutParams()返回的LayoutParams所做的任何更改都将被正确反映。它可以根据Android版本进行改变。因此,您必须致电setLayoutParams()以确保视图更新这些更改。

0

如果不使用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也会被调用。

相关问题