Comment définir par programmation l'attribut layout_align_parent_right d'un bouton dans une disposition relative?

285

J'ai une disposition relative que je crée par programmation:

 RelativeLayout layout = new RelativeLayout( this );
    RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,
            LayoutParams.WRAP_CONTENT);

Maintenant, j'ai deux boutons que je veux ajouter dans cette disposition relative. Mais le problème est que les deux boutons sont affichés à gauche du RelatiiveLayout qui se chevauchent.

buttonContainer.addView(btn1);
buttonContainer.addView(btn2);

Maintenant, je veux savoir comment puis-je définir par programmation l' attribut android:layout_alignParentRight="true"ou l' android:layout_toLeftOf="@id/btn"attribut des boutons comme nous le faisons dans le xml?

Fahad Ali
la source

Réponses:

638

Vous pouvez accéder à n'importe quel LayoutParamscode à l'aide de View.getLayoutParams. Vous devez juste être très conscient de ce à quoi LayoutParamsvous accédez. Ceci est normalement réalisé en vérifiant le contenant ViewGroups'il a un LayoutParamsenfant intérieur alors c'est celui que vous devez utiliser. Dans votre cas, c'est RelativeLayout.LayoutParams. Vous utiliserez RelativeLayout.LayoutParams#addRule(int verb)etRelativeLayout.LayoutParams#addRule(int verb, int anchor)

Vous pouvez y accéder via le code:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)button.getLayoutParams();
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
params.addRule(RelativeLayout.LEFT_OF, R.id.id_to_be_left_of);

button.setLayoutParams(params); //causes layout update
Rich Schuler
la source
1
que faire si l'ancre n'a pas d'identifiant? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = new TextView (act);
Saint Robson
18
que diriez-vous d'ajouter l'ID?
user2161301
1
Et si buttonest sur un RecycleView? N'est-ce pas un problème d'ajouter des règles identiques ou opposées au même widget?
János
Cela ne fonctionne qu'une fois, si je change d'alignement, il ne sera pas mis à jour. Puis-je savoir quel peut être le problème?
Shshank Bhong
J'ai essayé d'utiliser ça mais ça devient rouge dans mon code pour addRule?
12
  1. vous devez créer et identifier les boutons dont vous avez besoin pour faire référence: btn1.setId(1);
  2. vous pouvez utiliser la variable params pour ajouter des paramètres à votre mise en page, je pense que la méthode est addRule(), consultez les documents java android pour cet LayoutParamsobjet.
codeScriber
la source
J'apprécierais fortement n'importe quel morceau de code. Je ne trouve aucune méthode dans le bouton.
Fahad Ali
Définir id n'aide pas car il attend un vrai identifiant de ressource au lieu d'un simple nombre puisque setId est annoté avec @IdRes.
Kevin Tan
c'est nouveau alors, dans le passé, vous pouviez prendre un numéro de ressource dans les mises en page par exemple et l'utiliser comme base pour l'ID de ressource qui ne se heurterait pas. Je suppose que Google doit avoir bloqué ce /
codeScriber
6

Pour ajouter un RelativeLayoutattribut dont la valeur est vraie ou fausse, utilisez 0pour faux et RelativeLayout.TRUEpour vrai:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) button.getLayoutParams()
params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE)

Peu importe que l'attribut ait déjà été ajouté ou non, vous l'utilisez toujours addRule(verb, subject)pour l'activer / le désactiver. Cependant, vous pouvez utiliser la post-API 17, removeRule(verb)qui n'est qu'un raccourci pour addRule(verb, 0).

chaussure
la source
0

Version Kotlin:

Utilisez ces extensions avec des fonctions d'infixe qui simplifient les appels ultérieurs

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

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

infix fun View.alightParentRightIs(aligned: Boolean) {
    val layoutParams = this.layoutParams as? RelativeLayout.LayoutParams
    if (aligned) {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT)
    } else {
        (this.layoutParams as? RelativeLayout.LayoutParams)?.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0)
    }
    this.layoutParams = layoutParams
}

Ensuite, utilisez-les comme appels de fonctions infixes:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Ou vous pouvez les utiliser comme fonctions normales:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
Mahmoud
la source