2016-02-19 131 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也會被調用。

相關問題