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

203

Ist es möglich, beim Erstellen eines RelativeLayout zur Laufzeit das Äquivalent von android:layout_belowprogrammgesteuert festzulegen?

AlanH
quelle

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.

Rich Schuler
quelle
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);
Jackofallcode
quelle
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);
CoolMind
quelle
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)
Mahmoud
quelle