web-dev-qa-db-fra.com

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 très bien). 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 "à droite de" pour le relier à 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?

67
Regis St-Gelais

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

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

[~ # ~] éditez [~ # ~] (grâce à Roger Rapid ):

Depuis le 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 à l'aide de la ligne de code suivante:

layoutParams.removeRule(RelativeLayout.RIGHT_OF);

Et vous obtiendrez exactement le même résultat que lors de l'ajout d'une règle zéro comme:

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0);
145
Michael

Je pense que vous devez appeler:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

après avoir changé les LayoutParams.

En réponse à la modification, vous pouvez créer de nouveaux paramètres de disposition 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 disposition à l'aide de la méthode updateViewLayout () mentionnée précédemment.

3
Matthew Willis

ajoutez le code suivant à votre code existant

linearLayoutToMove.setLayoutParams(layoutParams)

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

0
Rohit Mandiwal