70 votes

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

J'ai une présentation linéaire qui est contenue dans une présentation relative. Elle est définie dans le fichier XML pour être à la droite d'une autre disposition linéaire (cela fonctionne bien). Dans certains cas, je souhaite modifier la position relative de la mise en page pendant l'activité onCreate. Je dois donc modifier le paramètre "à droite de" 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 cela ne fonctionne pas :o(

Des indices ?

152voto

Michael Points 16659

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 pour 0 . Par exemple

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

EDIT (merci à Roger Rapid ) :

À 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);

6 votes

À partir du niveau 17 de l'API, la classe RelativeLayout.LayoutParams possède la méthode suivante : public void removeRule (int verb)

1 votes

Que dois-je faire pour les applications avant le niveau 17 de l'API ? :o

3 votes

@marienke Définir une règle pour 0 est similaire à la suppression de la règle.

3voto

Matthew Willis Points 26453

Je pense que tu dois appeler :

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

après avoir modifié les 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 paramètres de mise en page à l'aide de la méthode updateViewLayout() mentionnée précédemment.

0voto

rohit mandiwal Points 4883

Ajoutez le code suivant à votre code existant

linearLayoutToMove.setLayoutParams(layoutParams)

Je pense que ça devrait faire l'affaire. Si la ligne ci-dessus ne fonctionne pas, essayez d'appeler linearLayoutToMove.invalidate() après la ligne ci-dessus.

0 votes

Puisque je suis dans onCreate, je n'ai pas besoin d'appeler invalidate().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X