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.