¿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.

Rich Schuler
fuente
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);
jackofallcode
fuente
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);
CoolMind
fuente
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)
Mahmoud
fuente