232 votes

La pose des Vues en RelativeLayout par programmation

Je suis en train de réaliser les suivants par programme (plutôt que de manière déclarative via XML):

<RelativeLayout...>
   <TextView ...
      android:id="@+id/label1" />
   <TextView ...
      android:id="@+id/label2"
      android:layout_below: "@id/label1" />
</RelativeLayout>

En d'autres termes, comment puis-je faire la deuxième TextView apparaissent en dessous du premier, mais je veux le faire dans le code:

RelativeLayout layout = new RelativeLayout(this);
TextView label1 = new TextView(this);
TextView label2 = new TextView(this);
...
layout.addView(label1);
layout.addView(label2);
setContentView(layout);

Mise à jour:

Merci, TreeUK. Je comprends la direction générale, mais cela ne fonctionne toujours pas - "B" chevauche "Un". Ce que je fais mal?

RelativeLayout layout = new RelativeLayout(this);
TextView tv1 = new TextView(this);
tv1.setText("A");

TextView tv2 = new TextView(this);
tv2.setText("B");
RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.FILL_PARENT);
lp.addRule(RelativeLayout.RIGHT_OF, tv1.getId());

layout.addView(tv1);        
layout.addView(tv2, lp);

195voto

De ce que j'ai pu rassembler, vous devez ajouter la vue à l'aide de LayoutParams.

LinearLayout linearLayout = new LinearLayout(this);

RelativeLayout.LayoutParams relativeParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
relativeParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);

parentView.addView(linearLayout, relativeParams);

Tout le crédit à sechastain, relativement à la position de vos articles par programmation, vous devez affecter des codes.

TextView tv1 = new TextView(this);
tv1.setId(1);
TextView tv2 = new TextView(this);
tv2.setId(2);

Ensuite, addRule(RelativeLayout.RIGHT_OF, tv1.getId());

60voto

Meymann Points 998

Couper la longue histoire courte: Avec une relative mise en page, la position des éléments à l'intérieur de la mise en page.

  1. créer un nouveau RelativeLayout.LayoutParams

    RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(...)
    

    (quoi que... remplir parent ou de la pellicule de contenu, en chiffres absolus, si vous devez, ou une référence à une ressource XML)

  2. Ajouter des règles: Règles reportez-vous à la mère ou à d'autres "frères" dans la hiérarchie.

    lp.addRule(RelativeLayout.BELOW, someOtherView.getId())
    lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
    
  3. Il suffit d'appliquer la mise en page params: La plus "saine" façon de le faire est:

    parentLayout.addView(myView, lp)
    

Attention: Ne pas modifier la présentation de la mise en page de rappels. Il est tentant de le faire parce que c'est quand vue d'obtenir leur taille réelle. Toutefois, dans ce cas, des résultats inattendus sont attendus.

29voto

fastfox Points 186

Je viens de passer 4 heures avec ce problème. Finalement réalisé que vous ne devez pas utiliser de zéro, comme identification. Vous pourriez penser qu'il est autorisé en tant NO_ID == -1, mais les choses ont tendance à se détraquer si vous donnez à votre vue...

7voto

user299870 Points 41

appel

tv1.setId(1) 

après

tv1.setText("A");

4voto

Frank N. Stein Points 12861

Essayez:

EditText edt = (EditText) findViewById(R.id.YourEditText);
RelativeLayout.LayoutParams lp =
    new RelativeLayout.LayoutParams
    (
        LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT
    );
lp.setMargins(25, 0, 0, 0); // move 25 px to right (increase left margin)
edt.setLayoutParams(lp); // lp.setMargins(left, top, right, bottom);

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