Comment disposer de Vues dans RelativeLayout par programmation?
Je suis en train de réaliser ce qui suit 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);
Dans l'exemple de code, vous n'êtes pas vraiment l'ajout de la règle de RelativeLayout.Ci-DESSOUS, tv1.getId();
vous devez fournir la carte d'identité pour votre enfant vues: tv1.setId(1); tv2.setId(2); Parent points de vue ne sont pas attribuer automatiquement les vues enfant d'un Id, et la valeur par défaut pour un attribut Id est NO_ID. Id n'avez pas à être unique dans une vue hiérarchique; 1, 2, 3, etc sont tous beaux les valeurs à utiliser, et vous devez les utiliser pour par rapport à l'ancrage de travailler dans RelativeLayout.
vous devez fournir la carte d'identité pour votre enfant vues: tv1.setId(1); tv2.setId(2); Parent points de vue ne sont pas attribuer automatiquement les vues enfant d'un Id, et la valeur par défaut pour un attribut Id est NO_ID. Id n'avez pas à être unique dans une vue hiérarchique; 1, 2, 3, etc sont tous beaux les valeurs à utiliser, et vous devez les utiliser pour par rapport à l'ancrage de travailler dans RelativeLayout.
OriginalL'auteur Dan | 2010-02-21
Vous devez vous connecter pour publier un commentaire.
De ce que j'ai pu rassembler, vous devez ajouter la vue à l'aide de LayoutParams.
Tout le crédit à sechastain, relativement à la position de vos articles par programmation, vous devez attribuer des identifiants pour eux.
Puis
addRule(RelativeLayout.RIGHT_OF, tv1.getId());
dans mon cas, en dehors de réglage de l'id d'un childview, ajoutant childview à la parentview et de l'appel de requestLayout() sur childview avant de fixer les règles de l'autre childview fait les choses fonctionnent. Espérons que cela aide quelqu'un
Dans le cas où quelqu'un suit encore ceci: quand j'ai une collection de points de vue, je suis en ajoutant un par un et je ne peux pas être certain que l'un des points de vue qu'un élément est défini pour être
below
a déjà été ajouté, comment s'assurer que ça s'affiche correctement? De ma compréhensionaddView
les causes de la présentation pour la rendre à nouveau, donc si je le fais pour un élément qui est relatif n'a pas encore été ajouté, ça va crash depuis l'élément avec l'ID n'existe pas encore.set(id) doit être utilisé avec generateViewId () a été Ajouté dans l'API de niveau 17. Il Génère une valeur appropriée pour l'utilisation dans setId(int). Cette valeur ne sera pas entrer en collision avec les valeurs d'ID généré au moment de la construction par aapt pour R. id. Exemple: la télévision[l_idx].setId(point de Vue.generateViewId());
OriginalL'auteur Tristan Warner-Smith
Couper la longue histoire courte:
Avec une relative mise en page, la position des éléments à l'intérieur de la mise en page.
créer un nouveau RelativeLayout.LayoutParams
(quoi que... remplir parent ou de la pellicule de contenu, nombres absolus, si vous devez, ou une référence à une ressource XML)
Ajouter des règles:
Règles reportez-vous à la mère ou à d'autres "frères" dans la hiérarchie.
Il suffit d'appliquer la mise en page params: La plus "saine" façon de le faire est:
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.
parentLayout.addView(myView, lp
). J'ai toujours fait ça en deux lignes de code. Merci!!!!unexpected results are expected
lolIl a travaillé pour moi et m'a beaucoup aidé, mais est-il un moyen d'aligner les enfants au-dessous de quelque chose et puis définissez la marge au-dessus pour cet enfant? Ou puis-je définir la marge ci-dessous pour la chose que c'est ci-dessous et il réglé correctement?
Bien sûr, il est. Vous pouvez définir les marges (malheureusement, la programmation de l'API n'est pas aussi confortable que le XML) avec setMargins (gauche, haut, droite, bas). C'est dans le LayoutParams. Notez que le rembourrage est une propriété de la vue, et non pas la mise en page params.
Cette réponse est claire.
OriginalL'auteur Meymann
Viens de passer 4 heures avec ce problème. Finalement réalisé que vous ne devez pas utiliser le zéro d'afficher l'id. 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...
Android est un gâchis
Vous avez tout à fait peut-être juste qu'il m'a sauvé une TONNE de temps. Merci!
Vous avez sauvé mon cul homme, merci)
OriginalL'auteur fastfox
Android 22 minimale praticable exemple
Source:
Fonctionne avec le projet par défaut généré par
android create project ...
. GitHub avec un minimum de construire le code.TextView
? J'ai essayé et la troisièmeTextView
est manquant.J'ai réussi, code modifié.
OriginalL'auteur Ciro Santilli 新疆改造中心996ICU六四事件
appel
après
FYI - je l'ai appelé .setId() juste avant que je ajouter de la vue et il a travaillé, aucune idée de pourquoi.. lol
OriginalL'auteur user299870
Essayer:
OriginalL'auteur Fantômas
Cette approche avec ViewGroup.MarginLayoutParams fonctionné pour moi:
OriginalL'auteur Gene Bo
OriginalL'auteur Richa
Si vous voulez vraiment mise en page manuellement, je vous suggère de ne pas utiliser une mise en page standard à tous. Tout faire sur votre propre, ici un kotlin exemple:
Cela peut vous donner une idée de comment cela pourrait fonctionner
OriginalL'auteur martyglaubitz