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

203

Est-il possible lors de la création d'un RelativeLayout lors de l'exécution de définir l'équivalent de par android:layout_belowprogramme?

AlanH
la source

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.

Rich Schuler
la source
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);
jackofallcode
la source
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);
CoolMind
la source
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)
Mahmoud
la source