Как программно удалить существующее правило, определенное в XML? - PullRequest
65 голосов
/ 24 февраля 2011

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

    RelativeLayout.LayoutParams layoutParams;

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

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

Есть какие-нибудь подсказки?

Ответы [ 3 ]

144 голосов
/ 25 февраля 2011

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

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

РЕДАКТИРОВАТЬ (благодаря Roger Rapid ):

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

public void removeRule(int verb) 

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

layoutParams.removeRule(RelativeLayout.RIGHT_OF);

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

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
3 голосов
/ 24 февраля 2011

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

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

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

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

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

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

0 голосов
/ 24 февраля 2011

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

linearLayoutToMove.setLayoutParams(layoutParams)

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

...