Comment supprimer par programme une règle existante définie en XML?

J’ai une disposition linéaire qui est contenue dans une disposition relative. Il est défini dans le fichier XML pour être à droite d’une autre disposition linéaire (cela fonctionne correctement). Dans certains cas, je souhaite modifier la position relative de la mise en page lors de la création de l’activité. Je dois donc modifier le paramètre “vers la droite” pour qu’il se rapporte à une autre mise en page. J’ai essayé ceci:

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

Mais ça ne marche pas: o (

Des indices?

Vous ne pouvez pas supprimer une règle car toutes les règles sont toujours stockées dans un tableau Java de taille fixe. Mais vous pouvez définir une règle à 0 . Par exemple

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

EDIT (merci à Roger Rapid ):

A partir du niveau 17 de l’API, la classe RelativeLayout.LayoutParams a la méthode suivante:

 public void removeRule(int verb) 

Vous pouvez donc supprimer une règle en utilisant la ligne de code suivante:

 layoutParams.removeRule(RelativeLayout.RIGHT_OF); 

Et vous obtiendrez exactement le même résultat qu’en ajoutant une règle zéro comme:

 layoutParams.addRule(RelativeLayout.RIGHT_OF, 0); 

Je pense que vous devez appeler:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

après avoir modifié le LayoutParams.

En réponse à la modification, vous pouvez créer de nouveaux LayoutParameters en utilisant:

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

puis ajoutez vos nouvelles règles. Ensuite, mettez à jour les parameters de mise en page à l’aide de la méthode updateViewLayout () mentionnée précédemment.

ajoutez le code suivant à votre code existant

linearLayoutToMove.setLayoutParams(layoutParams)

Je pense que cela devrait faire le travail. Si la ligne ci-dessus ne fonctionne pas, essayez d’appeler linearLayoutToMove.invalidate() après la ligne ci-dessus.