2016-02-19 11 views
6

Na przykład, jeśli chcesz ot zmianę LayoutParams jakiegoś względu na WRAP_CONTENT zarówno width i height programmaticaly, będzie wyglądać somethong tak:Dlaczego używamy setLayoutParams?

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

Jak undestood getLayoutParams powraca odniesienia dla parametrów, więc ten kod będzie wystarczy, ale często widzę w przykładach i tak dalej, że po tej linii, jedna następująco:

yourView.setLayoutParams(lp); 

i zastanawiam się jaki jest sens tej linii. Czy jest to tylko ze względu na lepszą czytelność kodu lub są przypadki, kiedy nie będzie działać bez niego?

+0

Głosuję czytelność. Jednak nigdy nie widziałem tych przykładów, w których istniejące widoki wymagają dynamicznej zmiany rozmiaru. Zwykle widoki są dynamicznie dodawane do widoku treści. W takich przypadkach potrzebna jest setLayoutParams. –

Odpowiedz

4

setLayoutParams() również wyzwala resolveLayoutParams() i requestLayout(), które powiadomi widok, że coś się zmieniło, odśwież go. Lub nie możemy zagwarantować, że rzeczywiście działają nowe parametry układu.


zobaczyć View.setLayoutParams kod Źródła:

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

Zasadniczo potrzebujemy jej tylko wtedy, gdy widok został już narysowany i musimy go później zmienić? –

+0

Tak. Wywołanie go podczas zmiany istniejących parametrów widoku w środowisku wykonawczym – sakiM

0

Nie można zagwarantować, że wszelkie zmiany wprowadzone w elementach LayoutParams, które zostały zwrócone przez getLayoutParams(), zostaną poprawnie odzwierciedlone. Może się różnić w zależności od wersji Androida. Musisz więc zadzwonić pod numer setLayoutParams(), aby upewnić się, że widok zaktualizuje te zmiany.

0

Jeśli nie używać setLayoutParams(), ustawienie układ byłby skuteczny, gdy View.onLayout() nazwać.

Oto kod źródłowy 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(); }

Jak widać, requestLayout będzie nazywany w setLayoutParams. Ten widok byłby natychmiast przekazywany ponownie. Zostanie również wywołany onLayout.

Powiązane problemy