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.