Czy mogę programowo ustawić „android: layout_below” w środowisku wykonawczym?

Odpowiedzi:

464

Tak:

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);

Najpierw kod tworzy nowe parametry układu, określając wysokość i szerokość. addRuleMetoda dodaje równowartość xml prawidłowo android:layout_below. Następnie wystarczy wywołać View#setLayoutParamswidok, który chcesz mieć te parametry.

Rich Schuler
źródło
11
dlaczego nie można zaakceptować tej odpowiedzi? To bardzo dobre wytłumaczenie.
Adithya,
145

Alternatywnie możesz użyć widoków bieżących parametrów układu i zmodyfikować je:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);
jackofallcode
źródło
14
@EelLee Jest to całkiem inny sposób na odpowiedź na pytanie, dlatego ma 11 głosów pozytywnych.
Alex K
8
Powinno to mieć więcej głosów pozytywnych niż druga odpowiedź: aby zachować spójne zachowanie widoku, powinniśmy pracować z istniejącymi, LayoutParamsa nie tworzyć nowe. W rzeczywistości należy to zaakceptować jako prawidłową odpowiedź.
Alex Karshin,
10

Chociaż odpowiedź @jackofallcode jest poprawna, można ją zapisać w jednym wierszu:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);
CoolMind
źródło
1
nie pozwala to na faktyczną zmianę układu, ponieważ potrzebujesz odniesienia LayoutParamsdo ustawieniasetLayoutParams
Stef
@Stef, użyłem tego rozwiązania w jednym projekcie. Chociaż rozwiązanie jackofallcode jest tutaj jedyne, uprościłem je. Ale teraz myślę, że skrócenie do jednej linii nie jest dobre, ponieważ jeśli wystąpi jakiś wyjątek, trudniej będzie zrozumieć, co operator go podniósł.
CoolMind,
1
@CoolMind Naprawdę nie lubię skracania kodu do 1 wiersza, utrudnia to czytanie, szczególnie gdy jest włączony rzut. Plus zrobienie tego po swojemu pozwala na dalsze zmiany :)
jackofallcode
@jackofallcode, zgadzam się z tobą! Obecnie piszę również w kilku wierszach, ponieważ kiedy dochodzi do awarii, łatwiej jest zrozumieć, w której linii wystąpił błąd.
CoolMind
1

Wersja Kotlin z funkcją infix

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

Następnie możesz napisać:

view1 below view2

Możesz też nazwać to normalną funkcją:

view1.below(view2)
Mahmoud
źródło