How do I programmatically remove an existing rule that was defined in XML?

AndroidAndroid LayoutAndroid RelativelayoutLayoutparams

Android Problem Overview


I have a linear layout that is contained inside a relative layout. It is set in the XML file to be to the right of another linear layout (this works fine). In some cases I want to change the relative position of the layout during the onCreate of the activity so I need to modify the "to the right of" param to relate to another layout. I tryed this:

    RelativeLayout.LayoutParams layoutParams;

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

But it does not work :o(

Any clues ?

Android Solutions


Solution 1 - Android

You can't remove a rule because all rules are always stored in a fixed-size java array. But you can set a rule to 0. For example

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

EDIT (thanks to Roger Rapid):

As of API level 17, the class RelativeLayout.LayoutParams has the following method:

public void removeRule(int verb) 

So you can remove a rule using the following line of code:

layoutParams.removeRule(RelativeLayout.RIGHT_OF);

And you will get exactly the same result as when 'adding' a zero-rule as:

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);

Solution 2 - Android

I think you need to call:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

after changing the LayoutParams.

In reply to the edit, you can create new LayoutParameters using:

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

and then add your new rules. Then, update the layout parameters using the previously mentioned updateViewLayout() method.

Solution 3 - Android

add the following code to your existing code

linearLayoutToMove.setLayoutParams(layoutParams)

I think this should do the job. In case if the above line dont work, try to call linearLayoutToMove.invalidate() after the above line.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRegis St-GelaisView Question on Stackoverflow
Solution 1 - AndroidMichaelView Answer on Stackoverflow
Solution 2 - AndroidMatthew WillisView Answer on Stackoverflow
Solution 3 - AndroidAshishView Answer on Stackoverflow