У меня есть линейная компоновка, содержащаяся в относительном макете.
Он задан в файле XML справа от другого линейного макета (это отлично работает).
В некоторых случаях я хочу изменить относительное положение макета во время onCreate активности, поэтому мне нужно изменить параметр "справа от", чтобы связать его с другим макетом.
Я попробовал это:
RelativeLayout.LayoutParams layoutParams;
layoutParams = (RelativeLayout.LayoutParams) linearLayoutToMove
.getLayoutParams();
layoutParams.addRule(RelativeLayout.RIGHT_OF,
R.id.new_ref_LinearLayout);
Но это не работает: o (
Любые подсказки?
Ответ 1
Вы не можете удалить правило, потому что все правила всегда хранятся в массиве java фиксированного размера. Но вы можете установить правило на 0
. Например
layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
layoutParams.addRule(RelativeLayout.BELOW, R.id.new_ref_LinearLayout);
EDIT (благодаря Roger Rapid):
Начиная с уровня API 17, класс RelativeLayout.LayoutParams
имеет следующий метод:
public void removeRule(int verb)
Итак, вы можете удалить правило, используя следующую строку кода:
layoutParams.removeRule(RelativeLayout.RIGHT_OF);
И вы получите точно такой же результат, как при добавлении нулевого правила:
layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
Ответ 2
Думаю, вам нужно позвонить:
relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);
после изменения LayoutParams.
В ответ на редактирование вы можете создать новые LayoutParameters, используя:
LinearLayout.LayoutParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.FILL_PARENT,
LinearLayout.LayoutParams.FILL_PARENT);
а затем добавьте новые правила. Затем обновите параметры макета, используя ранее упомянутый метод updateViewLayout().
Ответ 3
добавьте следующий код в существующий код
linearLayoutToMove.setLayoutParams(layoutParams)
Я думаю, что это должно сработать. Если указанная выше строка не работает, попробуйте вызвать linearLayoutToMove.invalidate()
после указанной выше строки.