Wie entferne ich programmgesteuert eine vorhandene Regel, die in XML definiert wurde?

70

Ich habe ein lineares Layout, das in einem relativen Layout enthalten ist. Es ist in der XML-Datei so eingestellt, dass es sich rechts von einem anderen linearen Layout befindet (dies funktioniert einwandfrei). In einigen Fällen möchte ich die relative Position des Layouts während des onCreate der Aktivität ändern, sodass ich den Parameter "rechts von" ändern muss, um ihn auf ein anderes Layout zu beziehen. Ich habe es versucht:

    RelativeLayout.LayoutParams layoutParams;

    layoutParams = (RelativeLayout.LayoutParams) linearLayoutToMove
            .getLayoutParams();
    layoutParams.addRule(RelativeLayout.RIGHT_OF,
            R.id.new_ref_LinearLayout);

Aber es funktioniert nicht: o (

Irgendwelche Hinweise ?

Regis St-Gelais
quelle

Antworten:

151

Sie können eine Regel nicht entfernen, da alle Regeln immer in einem Java-Array mit fester Größe gespeichert sind. Sie können jedoch eine Regel festlegen 0. Zum Beispiel

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
layoutParams.addRule(RelativeLayout.BELOW, R.id.new_ref_LinearLayout);

EDIT (danke an Roger Rapid ):

Ab API-Ebene 17 verfügt die Klasse RelativeLayout.LayoutParamsüber die folgende Methode:

public void removeRule(int verb) 

Sie können eine Regel also mit der folgenden Codezeile entfernen:

layoutParams.removeRule(RelativeLayout.RIGHT_OF);

Und Sie erhalten genau das gleiche Ergebnis wie beim Hinzufügen einer Nullregel wie folgt:

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
Michael
quelle
6
Ab API-Level 17 verfügt die Klasse RelativeLayout.LayoutParams über die folgende Methode: public void removeRule (int verb)
Roger Rapid
1
Was mache ich für Apps vor API Level 17? : o
Marienke
3
@marienke Das Festlegen einer Regel auf 0ähnelt dem Entfernen der Regel.
Michael
3

Ich denke, Sie müssen anrufen:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

nach dem Ändern der LayoutParams.

Als Antwort auf die Bearbeitung können Sie neue LayoutParameter erstellen, indem Sie:

LinearLayout.LayoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT,
    LinearLayout.LayoutParams.FILL_PARENT);

und fügen Sie dann Ihre neuen Regeln hinzu. Aktualisieren Sie anschließend die Layoutparameter mit der zuvor erwähnten Methode updateViewLayout ().

Matthew Willis
quelle
0

Fügen Sie den folgenden Code zu Ihrem vorhandenen Code hinzu

linearLayoutToMove.setLayoutParams(layoutParams)

Ich denke, das sollte den Job machen. Falls die obige Leitung nicht funktioniert, versuchen Sie, linearLayoutToMove.invalidate()nach der obigen Leitung anzurufen .

Rohit Mandiwal
quelle
Da ich in onCreate bin, muss ich invalidate () nicht aufrufen.
Regis St-Gelais