Чи можу я встановити "android: layout_below" під час виконання програми програмно?


Відповіді:


464

Так:

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

По-перше, код створює нові параметри компонування, задаючи висоту та ширину. addRuleМетод додає еквівалент XML правильно android:layout_below. Тоді ви просто зателефонуйте View#setLayoutParamsна вигляд, у якому хочете мати ці парами.


11
чому не можна прийняти цю відповідь? Це дуже хороше пояснення.
Адітія

145

Крім того, ви можете використовувати параметри компонування перегляду та змінювати їх:

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

14
@EelLee Це досить очевидно інший спосіб відповісти на питання, через що він має 11 результатів.
Алекс К

8
Це повинно мати більше результатів, ніж інша відповідь: щоб підтримувати послідовну поведінку погляду, нам слід працювати з існуючими, LayoutParamsа не над створенням нових. Насправді це слід сприймати як правильну відповідь.
Олексій Каршин

10

Хоча відповідь @jackofallcode правильна, її можна записати одним рядком:

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

1
це не дозволяє фактично змінити макет, оскільки вам потрібна посилання LayoutParamsна встановити їхsetLayoutParams
Стеф

@Stef, я використав це рішення в одному проекті. Хоча рішення jackofallcode - єдине тут, я спростив його. Але зараз я вважаю, що скорочення до одного рядка не є гарним, тому що якщо виникне якийсь виняток, було б важче зрозуміти, який оператор його підняв.
CoolMind

1
@CoolMind Мені дуже не подобається скорочення коду до 1 рядка, це ускладнює його читання, особливо коли йдеться про кастинг. Плюс зробити це моїм способом дозволяє внести подальші зміни :)
jackofallcode

@jackofallcode, з вами згоден! В даний час я також пишу в декількох рядках, тому що, коли відбувається збій, простіше зрозуміти, у якому рядку сталася помилка.
CoolMind

1

Котлін версія з інфіксной функцією

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

Тоді ви можете написати:

view1 below view2

Або ви можете назвати це звичайною функцією:

view1.below(view2)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.