Как программно удалить существующее правило, которое было определено в 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() после указанной выше строки.

Intereting Posts
Android / Mobile Webkit CSS Background-Attachment: Исправлено Не работает? Создайте Apklib для строительства с maven Как я могу просмотреть предупреждения AIDE? Подсказка EditText не показана в 5.0.1 Android-менеджер sdk и значки менеджера avd не отображаются в моем затмении Невозможно установить интервал между строками «1» в Android Studio (больше?) Как установить шрифт Spannable object с пользовательским шрифтом Резервное копирование данных хранилищем данных Google Cloud Vs google drive vs другое хранилище Как использовать onActivityResult (..), если действие вызывается из меню Получение значения String из Spinner, поддерживаемого CursorAdapter, из SQL-запроса в Android Сделайте снимок экрана на любом экране Как обновить список навигационного ящика, как только он откроется / закрыт в Android Android: элементы в списках не становятся оранжевыми при нажатии? Режим блокировки DrawerLayout не работает должным образом Android: Как сделать эту фреймворк?