¿Cómo establecer mediante programación el atributo layout_align_parent_right de un botón en diseño relativo?

285

Tengo un diseño relativo que estoy creando mediante programación:

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

Ahora tengo dos botones que quiero agregar en este diseño relativo. Pero el problema es que ambos botones se muestran a la izquierda del RelatiiveLayout superpuestos entre sí.

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

Ahora quiero saber cómo puedo configurar mediante programación el android:layout_alignParentRight="true"o android:layout_toLeftOf="@id/btn"atributo de los botones como lo hacemos en el xml".

Fahad Ali
fuente

Respuestas:

638

Puede acceder a cualquier LayoutParamscódigo usando View.getLayoutParams. Solo tienes que ser muy consciente de a qué LayoutParamsestás accediendo. Esto normalmente se logra al verificar que contiene ViewGroupsi tiene un LayoutParamshijo interno, entonces ese es el que debe usar. En tu caso lo es RelativeLayout.LayoutParams. Estarás usando RelativeLayout.LayoutParams#addRule(int verb)yRelativeLayout.LayoutParams#addRule(int verb, int anchor)

Puedes acceder a él a través del código:

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
fuente
1
¿Qué pasa si el ancla no tiene identificación? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = new TextView (act);
San Robson
18
¿Qué hay de agregar la identificación?
user2161301
1
¿Qué pasa si buttonestá en un RecycleView? ¿No es un problema agregar reglas iguales u opuestas al mismo widget?
János
Funciona solo por una vez, si cambio la alineación no se actualiza. ¿Puedo saber cuál puede ser el problema?
Shshank Bhong
¿Intenté usar eso pero se vuelve rojo en mi código addRule?
12
  1. necesita crear e identificar los botones que necesita referenciar: btn1.setId(1);
  2. puede usar la variable params para agregar parámetros a su diseño, creo que el método es addRule(), consulte los documentos de Java de Android para este LayoutParamsobjeto.
codeScriber
fuente
Apreciaría mucho cualquier pieza de código. No encuentro ningún método en el botón.
Fahad Ali
La configuración de ID no ayuda, ya que espera una identificación de recurso real en lugar de solo un número, ya que setId se anota con @IdRes.
Kevin Tan
eso es nuevo, en el pasado, podría tomar un número de recurso de los diseños, por ejemplo, y usarlo como base para la identificación del recurso que no colisionará. Supongo que Google debe haber bloqueado ese /
codeScriber el
6

Para agregar un RelativeLayoutatributo cuyo valor es verdadero o falso, use 0falso y RelativeLayout.TRUEverdadero:

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

No importa si el atributo ya se agregó o no, todavía se usa addRule(verb, subject)para habilitarlo / deshabilitarlo. Sin embargo, después de API 17 puede usar, removeRule(verb)que es solo un atajo para addRule(verb, 0).

zapato
fuente
0

Versión Kotlin:

Utilice estas extensiones con funciones de infijo que simplifican las llamadas posteriores.

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
}

Luego úselos como llamadas de funciones infijadas:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

O puede usarlos como funciones normales:

view1.below(view2)
view1.leftOf(view2)
view1.alightParentRightIs(true)
Mahmoud
fuente