¿Puedo configurar "android: layout_below" en tiempo de ejecución mediante programación?


Respuestas:


464

Si:

RelativeLayout.LayoutParams params= new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT); 
params.addRule(RelativeLayout.BELOW, R.id.below_id);
viewToLayout.setLayoutParams(params);

Primero, el código crea un nuevo diseño de parámetros especificando la altura y el ancho. El addRulemétodo agrega el equivalente del xml correctamente android:layout_below. Luego solo invocas View#setLayoutParamsla vista que deseas tener esos parámetros.


11
¿Por qué no se puede aceptar esta respuesta? Es una muy buena explicación.
— Adithya

145

Alternativamente, puede usar los parámetros de diseño actuales de las vistas y modificarlos:

RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) viewToLayout.getLayoutParams();
params.addRule(RelativeLayout.BELOW, R.id.below_id);

14
@EelLee Es claramente otra forma de responder la pregunta, por eso tiene 11 votos a favor.
— Alex K

8
Esto debería tener más votos a favor que la otra respuesta: para mantener un comportamiento coherente de la vista, debemos trabajar con los existentes en LayoutParamslugar de crear otros nuevos. De hecho, esto debe ser aceptado como la respuesta correcta.
— Alex Karshin

10

Si bien la respuesta @jackofallcode es correcta, se puede escribir en una línea:

((RelativeLayout.LayoutParams) viewToLayout.getLayoutParams()).addRule(RelativeLayout.BELOW, R.id.below_id);

1
esto no le permite cambiar realmente el diseño, ya que necesita una referencia LayoutParamspara configurarlossetLayoutParams
— Stef

@ Stef, utilicé esta solución en un proyecto. Si bien la solución jackofallcode es la única aquí, la simplifiqué. Pero ahora creo que acortar a una línea no es bueno, porque si ocurre alguna excepción, sería más difícil entender qué operador la planteó.
— CoolMind

1
@CoolMind Realmente no me gusta acortar el código a 1 línea, hace que sea más difícil de leer, especialmente cuando se trata de casting. Además, hacerlo a mi manera te permite realizar más cambios :)
— jackofallcode

@jackofallcode, ¡de acuerdo contigo! Actualmente también escribo en varias líneas, porque cuando ocurre un bloqueo, es más fácil entender en qué línea se produjo un error.
— CoolMind

1

Versión Kotlin con función infija

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

Entonces puedes escribir:

view1 below view2

O puede llamarlo como una función normal:

view1.below(view2)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.