2016-02-19 16 views
6

Zum Beispiel, wenn Sie beide ot Änderung WRAP_CONTENTLayoutParams einiger Ansicht wollen für width und height programmaticaly, wird es wie folgt aussehen somethong:Warum verwenden wir setLayoutParams?

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

Als ich für params getLayoutParams kehrt Referenz undestood, sodass dieser Code würde genug, aber ich sehe oft in den Beispielen und so weiter, dass nach diesen Linien, eine folgt:

yourView.setLayoutParams(lp); 

und ich frage mich, was der Sinn dieser Linie ist. Ist das nur aus Gründen der besseren Lesbarkeit des Codes oder gibt es Fälle, in denen es ohne es nicht funktioniert?

+0

Ich stimme Lesbarkeit. Allerdings habe ich diese Beispiele nie gesehen, wo vorhandene Ansichten dynamisch in der Größe geändert werden müssen. Ich sehe normalerweise, dass Ansichten der Inhaltsansicht dynamisch hinzugefügt werden. In diesen Fällen wird setLayoutParams benötigt –

Antwort

4

setLayoutParams() auch trigger resolveLayoutParams() und requestLayout(), die die Ansicht benachrichtigt etwas geändert hat, aktualisieren Sie es. Oder wir können nicht sicherstellen, dass die neuen Layoutparameter tatsächlich funktionieren.


siehe View.setLayoutParams Quellen Code:

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

Also im Grunde brauchen wir es nur, wenn die Ansicht bereits gezeichnet wurde, und wir müssen es später ändern? –

+0

Ja. Rufen Sie es auf, wenn Sie in Runtime die Parameter einer vorhandenen Ansicht ändern – sakiM

0

Es kann nicht sichergestellt werden, dass Änderungen an LayoutParams, die von getLayoutParams() zurückgegeben wurden, korrekt wiedergegeben werden. Es kann durch Android-Version variiert werden. Sie müssen also setLayoutParams() anrufen, um sicherzustellen, dass die Ansicht diese Änderungen aktualisiert.

0

Wenn Sie nicht über die setLayoutParams() verwenden, Ihr Layout Einstellung wirksam sein würde, während die View.onLayout() aufgerufen werden. Hier

ist der Quellcode von 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(); }

Wie Sie sehen, würde die requestLayout in den setLayoutParams aufgerufen werden. Diese Ansicht würde sofort wieder angezeigt werden. Das onLayout würde auch aufgerufen werden.