Могу ли я установить «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);
jackofallcode
источник
14
@EelLee Это совершенно другой способ ответить на вопрос, поэтому у него 11 голосов.
Алекс К
8
Это должно иметь больше голосов, чем другой ответ: чтобы поддерживать согласованное поведение представления, мы должны работать с существующими, LayoutParamsа не создавать новые. На самом деле, это должно быть принято как правильный ответ.
Алекс Каршин
10

Хотя ответ @jackofallcode правильный, его можно записать в одну строку:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);
CoolMind
источник
1
это не позволяет вам на самом деле изменить макет, так как вам нужна ссылка на него, LayoutParamsчтобы установить ихsetLayoutParams
Stef
@Stef, я использовал это решение в одном проекте. Хотя решение jackofallcode является единственным здесь, я упростил его. Но теперь я думаю, что сокращение до одной строки нехорошо, потому что если возникнет какое-либо исключение, будет сложнее понять, какой оператор его поднял.
CoolMind
1
@CoolMind Мне не очень нравится сокращать код до 1 строки, это усложняет чтение, особенно когда речь идет о приведении. Плюс, делая это по-моему, вы сможете вносить дальнейшие изменения :)
jackofallcode
@jackofallcode, согласен с тобой! В настоящее время я также пишу в несколько строк, потому что, когда происходит сбой, легче понять, в какой строке произошла ошибка.
CoolMind
1

Версия Kotlin с инфиксной функцией

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

Тогда вы можете написать:

view1 below view2

Или вы можете вызвать его как обычную функцию:

view1.below(view2)
Махмуд
источник