Puis-je définir «android: layout_below» au moment de l'exécution par programme?


Réponses:


464

Oui:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);

Tout d'abord, le code crée un nouveau paramètre de mise en page en spécifiant la hauteur et la largeur. La addRuleméthode ajoute correctement l'équivalent du xml android:layout_below. Ensuite, vous appelez simplement View#setLayoutParamsla vue que vous souhaitez avoir ces paramètres.


11
pourquoi cette réponse ne peut-elle pas être acceptée? C'est une très bonne explication.
Adithya

145

Vous pouvez également utiliser les paramètres de présentation actuels des vues et les modifier:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);

14
@EelLee C'est clairement une autre façon de répondre à la question, c'est pourquoi il a 11 votes positifs.
Alex K

8
Cela devrait avoir plus de votes positifs que l'autre réponse: pour maintenir un comportement cohérent de la vue, nous devons travailler avec les existants LayoutParamsplutôt que d'en créer de nouveaux. En fait, cela devrait être accepté comme la bonne réponse.
Alex Karshin

10

Bien que la réponse @jackofallcode soit correcte, elle peut être écrite sur une seule ligne:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);

1
cela ne vous permet pas de modifier la mise en page car vous avez besoin d'une référence à la LayoutParamspour les définirsetLayoutParams
Stef

@Stef, j'ai utilisé cette solution dans un projet. Bien que la solution jackofallcode soit la seule ici, je l'ai simplifiée. Mais maintenant, je pense que le raccourcissement à une ligne n'est pas bon, car si une exception se produit, il serait plus difficile de comprendre quel opérateur l'a soulevée.
CoolMind

1
@CoolMind Je n'aime pas vraiment raccourcir le code à 1 ligne, il est plus difficile à lire, surtout lorsque le casting est impliqué. De plus, le faire à ma façon vous permet d'apporter d'autres modifications :)
jackofallcode

@jackofallcode, d'accord avec vous! Actuellement, j'écris également sur plusieurs lignes, car lorsqu'un crash se produit, il est plus facile de comprendre dans quelle ligne une erreur s'est produite.
CoolMind

1

Version Kotlin avec fonction infixe

infix fun View.below(view: View) {
      (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.BELOW, view.id)
}

Ensuite, vous pouvez écrire:

view1 below view2

Ou vous pouvez l'appeler comme une fonction normale:

view1.below(view2)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.