Подтвердить что ты не робот

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

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

    RelativeLayout.LayoutParams layoutParams;

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

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

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

4b9b3361

Ответ 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() после указанной выше строки.