2011-02-24 7 views
58

Tengo un diseño lineal que está contenido dentro de un diseño relativo. Se establece en el archivo XML para que esté a la derecha de otro diseño lineal (esto funciona bien). En algunos casos, deseo cambiar la posición relativa del diseño durante la onCreate de la actividad, por lo que necesito modificar el parámetro "a la derecha de" para relacionarlo con otro diseño. He probado esto:¿Cómo elimino mediante programación una regla existente que se definió en XML?

RelativeLayout.LayoutParams layoutParams; 

    layoutParams = (RelativeLayout.LayoutParams) linearLayoutToMove 
      .getLayoutParams(); 
    layoutParams.addRule(RelativeLayout.RIGHT_OF, 
      R.id.new_ref_LinearLayout); 

Pero esto no funciona:? O (

Alguna pista

Respuesta

132

No se puede eliminar una regla porque todas las reglas se almacenan siempre en una matriz java de tamaño fijo. Pero puede establecer una regla en 0. Por ejemplo

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0); 
layoutParams.addRule(RelativeLayout.BELOW, R.id.new_ref_LinearLayout); 

EDITAR (gracias a Roger Rapid):

A partir del nivel de la API 17, la clase RelativeLayout.LayoutParams tiene el siguiente método:

public void removeRule(int verb) 

para que pueda quitar una regla que usa la siguiente línea de código:

layoutParams.removeRule(RelativeLayout.RIGHT_OF); 

Y obtendrá exactamente el mismo resultado que cuando 'añadir' una regla de cero como:

layoutParams.addRule(RelativeLayout.RIGHT_OF, 0); 
+1

Es exactamente lo que hice. tks. –

+6

A partir del nivel 17 de API, la clase RelativeLayout.LayoutParams tiene el siguiente método: public void removeRule (verbo int) –

+1

¿Qué debo hacer para las aplicaciones antes del nivel 17 de api? : o – marienke

0

agregue el código siguiente a su código existente

linearLayoutToMove.setLayoutParams(layoutParams)

pienso esto debería hacer el trabajo. En caso de que la línea anterior no funcione, intente llamar al linearLayoutToMove.invalidate() después de la línea anterior.

+0

Desde que estoy en onCreate, no necesito llamar invalidate(). –

3

creo que es necesario llamar a:

relativeLayout.updateViewLayout(linearLayoutToMove, layoutParams);

después de cambiar los LayoutParams.

En respuesta a la edición, puede crear nuevos LayoutParameters usando:

LinearLayout.LayoutParams = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.FILL_PARENT, 
    LinearLayout.LayoutParams.FILL_PARENT);

y luego añadir sus nuevas reglas. A continuación, actualice los parámetros de diseño utilizando el método updateViewLayout() mencionado anteriormente.

+0

Respuesta agradable Gracias :) – Crowni

Cuestiones relacionadas