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

Tengo un diseño relativo que estoy creando programáticamente:

 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 programáticamente el android:layout_alignParentRight="true" o android:layout_toLeftOf="@id/btn" atributo de los botones como lo hacemos en el xml?

preguntado el 09 de enero de 11 a las 11:01

4 Respuestas

Puede acceder a cualquier LayoutParams del código usando View.getLayoutParams. Solo tienes que ser muy consciente de lo que LayoutParams su acceso. Esto se consigue normalmente comprobando el contenido ViewGroup si tiene un LayoutParams niño interior, entonces ese es el que debes usar. En tu caso es RelativeLayout.LayoutParams. Estarás usando RelativeLayout.LayoutParams#addRule(int verb) y RelativeLayout.LayoutParams#addRule(int verb, int anchor)

Puede 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

contestado el 10 de mayo de 13 a las 02:05

¿y si el ancla no tiene identificación? params.addRule (RelativeLayout.LEFT_OF, R.id.id_to_be_left_of); TextView tvUserName = new TextView (acto); - Saint Robson

¿qué tal agregar la identificación? - user2161301

Y si button está en una RecycleView? ¿No es un problema agregar reglas iguales o 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 pone rojo en mi código para addRule ? - usuario10147255

  1. necesita crear una identificación para los botones que necesita hacer referencia: 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 Android Java para esto LayoutParams objeto.

Respondido 09 Oct 15, 09:10

Agradecería mucho cualquier fragmento de código. No encuentro ningún método en el botón. - Fahad Ali

Establecer la identificación no ayuda, ya que se 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, entonces, en el pasado, podí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 eso / - codeScriber

Para agregar un RelativeLayout atributo cuyo valor es verdadero o falso uso 0 por falso y RelativeLayout.TRUE de verdad:

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, aún usa addRule(verb, subject) para habilitarlo / deshabilitarlo. Sin embargo, post-API 17 puede usar removeRule(verb) que es solo un atajo para addRule(verb, 0).

Respondido el 10 de junio de 18 a las 08:06

Versión de Kotlin:

Utilice estas extensiones con funciones infijas que simplifican 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 utilícelos como llamadas a funciones infijas:

view1 below view2
view1 leftOf view2
view1 alightParentRightIs true

O puede usarlos como funciones normales:

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

Respondido 29 Abr '20, 00:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.