Как программно удалить существующее правило, которое было определено в XML?

У меня есть линейный макет, который содержится внутри относительного макета. Он установлен в файле XML справа от другого линейного макета (это отлично работает). В некоторых случаях я хочу изменить относительное положение макета во время onCreate активности, поэтому мне нужно изменить параметр «справа от», чтобы связать его с другим макетом. Я пробовал это:

RelativeLayout.LayoutParams layoutParams; layoutParams = (RelativeLayout.LayoutParams) linearLayoutToMove .getLayoutParams(); layoutParams.addRule(RelativeLayout.RIGHT_OF, R.id.new_ref_LinearLayout); 

Но это не работает: o (

Любые подсказки?

Вы не можете удалить правило, потому что все правила всегда хранятся в массиве java фиксированного размера. Но вы можете установить правило в 0 . Например

 layoutParams.addRule(RelativeLayout.RIGHT_OF, 0); layoutParams.addRule(RelativeLayout.BELOW, R.id.new_ref_LinearLayout); 

EDIT (спасибо Роджеру Рапиду ):

Начиная с уровня API 17 класс RelativeLayout.LayoutParams имеет следующий метод:

 public void removeRule(int verb) 

Таким образом, вы можете удалить правило, используя следующую строку кода:

 layoutParams.removeRule(RelativeLayout.RIGHT_OF); 

И вы получите точно такой же результат, как при добавлении нулевого правила:

 layoutParams.addRule(RelativeLayout.RIGHT_OF, 0); 

Я думаю, вам нужно позвонить:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

После изменения LayoutParams.

В ответ на редактирование вы можете создать новые LayoutParameters, используя:

 LinearLayout.LayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); 

А затем добавьте новые правила. Затем обновите параметры макета, используя ранее упомянутый метод updateViewLayout ().

Добавьте следующий код в существующий код

linearLayoutToMove.setLayoutParams(layoutParams)

Я думаю, что это должно сработать. Если вышеуказанная строка не работает, попробуйте вызвать linearLayoutToMove.invalidate() после указанной выше строки.