Come impostare a livello di programmazione l'attributo layout_align_parent_right di un pulsante nel layout relativo?


285

Ho un layout relativo che sto creando a livello di programmazione:

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

Ora ho due pulsanti che voglio aggiungere in questo layout relativo. Ma il problema è che entrambi i pulsanti vengono visualizzati a sinistra di RelatiiveLayout sovrapposti l'uno sull'altro.

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

Ora voglio sapere come posso impostare programmaticamente il android:layout_alignParentRight="true"o l' android:layout_toLeftOf="@id/btn"attributo dei pulsanti come facciamo nell'xml?

Risposte:


638

Puoi accedere a qualsiasi LayoutParamscodice usando View.getLayoutParams. Devi solo essere molto consapevole di ciò che stai LayoutParamsaccedendo. Questo è normalmente ottenuto controllando il contenimento ViewGroupse ha un LayoutParamsbambino interiore, quindi è quello che dovresti usare. Nel tuo caso lo è RelativeLayout.LayoutParams. Utilizzerai RelativeLayout.LayoutParams#addRule(int verb)eRelativeLayout.LayoutParams#addRule(int verb, int anchor)

Puoi raggiungerlo tramite il codice:

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

1
cosa succede se l'ancora non ha un ID? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = new TextView (act);
Saint Robson,

18
che ne dici di aggiungere l'ID?
user2161301

1
E se buttonfosse su un RecycleView? Non è un problema aggiungere regole uguali o opposte allo stesso widget?
János,

Funziona solo per una volta, se cambio allineamento non viene aggiornato. Posso sapere quale può essere il problema ??
Shshank Bhong,

Ho provato a usarlo ma diventa rosso nel mio codice per addRule?

12
  1. devi creare e id per i pulsanti che devi fare riferimento: btn1.setId(1);
  2. puoi usare la variabile params per aggiungere parametri al tuo layout, penso che il metodo sia addRule(), controlla i documenti Android Java per questo LayoutParamsoggetto.

Apprezzerei molto qualsiasi codice. Non trovo alcun metodo nel pulsante.
Fahad Ali,

L'impostazione dell'id non aiuta poiché si aspetta un ID risorsa reale anziché solo un numero poiché setId viene annotato con @IdRes.
Kevin Tan,

che è nuovo allora, in passato potresti prendere un numero di risorsa dai layout per esempio e usarlo come base per un ID risorsa che non si scontrerà. Immagino che Google abbia bloccato quel /
codeScriber

6

Per aggiungere un RelativeLayoutattributo il cui valore è vero o falso usare 0per falso e RelativeLayout.TRUEper vero:

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

Non importa se l'attributo è già stato aggiunto o meno, si utilizza comunque addRule(verb, subject)per abilitarlo / disabilitarlo. Tuttavia, post-API 17 è possibile utilizzare, removeRule(verb)che è solo una scorciatoia per addRule(verb, 0).


0

Versione di Kotlin:

Utilizzare questi interni con funzioni infix che semplificano le chiamate successive

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
}

Quindi usali come chiamate alle funzioni infix:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

Oppure puoi usarli come normali funzioni:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.