Kann ich "android: layout_below" zur Laufzeit programmgesteuert einstellen?


Antworten:


464

Ja:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);

Zunächst erstellt der Code neue Layoutparameter, indem Höhe und Breite angegeben werden. Die addRuleMethode fügt das Äquivalent der XML ordnungsgemäß hinzu android:layout_below. Dann rufen Sie einfach View#setLayoutParamsdie Ansicht auf, in der Sie diese Parameter haben möchten.


11
Warum kann diese Antwort nicht akzeptiert werden? Das ist eine sehr gute Erklärung.
Adithya

145

Alternativ können Sie die aktuellen Layoutparameter der Ansichten verwenden und ändern:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);

14
@EelLee Es ist ganz klar eine andere Möglichkeit, die Frage zu beantworten, weshalb es 11 positive Stimmen gibt.
Alex K

8
Dies sollte mehr positive Stimmen haben als die andere Antwort: Um ein konsistentes Verhalten der Ansicht aufrechtzuerhalten, sollten wir mit vorhandenen arbeiten, LayoutParamsanstatt neue zu erstellen. In der Tat sollte dies als die richtige Antwort akzeptiert werden.
Alex Karshin

10

Während die @ jackofallcode-Antwort korrekt ist, kann sie in eine Zeile geschrieben werden:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);

1
Dies erlaubt Ihnen nicht, das Layout tatsächlich zu ändern, da Sie einen Verweis auf das benötigen LayoutParams, um sie einzustellensetLayoutParams
Stef

@Stef, ich habe diese Lösung in einem Projekt verwendet. Obwohl die Jackofallcode-Lösung hier das einzige ist, habe ich sie vereinfacht. Aber jetzt denke ich, dass das Kürzen auf eine Zeile nicht gut ist, denn wenn eine Ausnahme auftritt, ist es schwieriger zu verstehen, welcher Operator sie ausgelöst hat.
CoolMind

1
@CoolMind Ich mag es nicht wirklich, Code auf eine Zeile zu kürzen, es macht das Lesen schwieriger, besonders wenn es um Casting geht.
Wenn

@jackofallcode, stimme dir zu! Derzeit schreibe ich auch in mehreren Zeilen, da es bei einem Absturz einfacher ist zu verstehen, in welcher Zeile ein Fehler aufgetreten ist.
CoolMind

1

Kotlin- Version mit Infix- Funktion

infix fun View.below(view: View) {
      (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}

Dann können Sie schreiben:

view1 below view2

Oder Sie können es als normale Funktion aufrufen:

view1.below(view2)
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.