2012-05-22 17 views
14

Tengo un RelativeLayout, como a continuación:RelativeLayout Agregar regla "RelativeLayout.LEFT_OF" no trabajar

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="horizontal" 
    android:id="@+id/parent" > 

    <ListView 
     android:layout_width="360dp" 
     android:layout_height="600dp" 
     android:id="@+id/list" 
     android:inputType="text" 
     android:maxLines="1" 
     android:layout_margin="50dp" 
     android:layout_alignParentRight="true" 
     /> 
</RelativeLayout> 

En el código de Java, quiero añadir una vista a la izquierda de la vista de lista, pero no lo hicieron trabajado:

m_relativeLayout = (RelativeLayout)findViewById(R.id.parent); 
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 
layoutParams.addRule(RelativeLayout.LEFT_OF, m_listView.getId()); 
Button button2 = new Button(this); 
button2.setText("I am button 2"); 
m_relativeLayout.addView(button2, layoutParams); 

solamente si fijo la vista de lista para alignParentRight, va a trabajar. ¿Es esto un error de Android o me falta algo?

Siempre trato de addView(View child, int index, LayoutParams params), pero podría funcionar solo en la distribución lineal. Entonces, ¿hay una solución normal para que el RelativeLayout.LEFT_OF funcione?

EDITAR

me han tratado RelativeLayout.BELOW y RelativeLayout.RIGHT_OF, y funcionó a la perfección, por lo que significa que no tengo suficiente lugar para obtener el botón? Traté de dar más espacio, pero todavía no funciona.

Uso Toshiba AT100 (1280 * 800) y paisaje, por lo que el espacio es suficiente. Pruebe below y right igual que el left. Creo que si pongo un control A en la salida relativa, entonces agrego el control B y deduzco que está a la izquierda del control A, el resultado debería ser que el control B empujará el control A hacia la derecha, ¿no?

+0

¿Dónde aparece la vista? – Barak

+0

La relativelayout es la vista principal de la actividad y tiene espacio para agregar el botón. – dreamtale

+0

En realidad, quiero decir, ¿el botón simplemente no aparece o aparece en un lugar inapropiado? – Barak

Respuesta

22

Creo que si pongo un control A en el RelativeLayout, a continuación, añado de control B y declarar que está en la izquierda del control A, el resultado debería ser el control B empujará el control A hacia su derecha, ¿no?

Supongo que es incorrecto, el control A no se desplazará hacia la derecha a menos que haya especificado esto con una regla RelativeLayout.LayoutParams. RelativeLayout coloca a sus hijos uno encima del otro comenzando en la esquina superior izquierda de la pantalla si no especifica reglas de ubicación para ellos.Cuando agrega el View A al RelativeLayout sin ninguna regla (como layout_alignParentRight), se colocará comenzando desde la esquina superior izquierda de la pantalla. Luego, cuando agrega el View B, se aplicará la regla to_leftOf a esta posición View, pero esta regla no significa nada para el View A que mantendrá su posición en la pantalla. Esto hará que View B se coloque a la izquierda de View A, pero fuera de la pantalla como View A empieza desde el borde izquierdo de la pantalla.

El Button serán colocados a la izquierda de la ListView cuando se utiliza layout_alignParentRight="true" porque ahora hay espacio para ver realmente el Button (que no es fuera más). addView(View child, int index, LayoutParams params) funciona en un LinearLayout porque el LinearLayout organiza sus hijos en una fila o columna (según la orientación) de modo que cuando agrega un View en una posición específica, empujará el otro Views después a la derecha o debajo (según la orientación) (no hay un posicionamiento relativo de las vistas en un LinearLayout, la única regla es que los niños vienen uno después del otro).

A partir de la ListView sin reglas establecidas en él, aquí es un ejemplo de cómo hacer la Button a aparecer en la parte izquierda de la ListView:

RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT); 
Button button2 = new Button(this); 
button2.setText("I am button 2"); 
button2.setId(1000); 
m_relativeLayout.addView(button2, layoutParams); 
RelativeLayout.LayoutParams rlp = (RelativeLayout.LayoutParams) m_listView 
      .getLayoutParams(); 
rlp.addRule(RelativeLayout.RIGHT_OF, button2.getId()); 

El botón se añadirá como normal a la pantalla y aparecerá a partir de la esquina superior izquierda de la pantalla. Sin las dos líneas del código anterior, se superpondrán Button y ListView, ya que este es el comportamiento normal de RelativeLayout para niños sin ninguna regla sobre ellos. Luego, modificamos explícitamente la posición del ListView para moverlo a la derecha (con las dos últimas líneas del código anterior).

+0

Uso Toshiba AT100 (1280 * 800) y el paisaje, por lo que el espacio es suficiente Test 'below' y' right' igual que el 'left'. Creo que si pongo un control A en la salida relativa, entonces agrego el control B y deduzco que está a la izquierda del control A, el resultado debería ser que el control B empujará el control A hacia la derecha, ¿no? – dreamtale

+0

@dreamtale No entendí tu pregunta la primera vez. He editado mi respuesta, a ver si eso ayuda. – Luksprog

+0

Gracias por su elaborada respuesta, lo he hecho funcionar :) – dreamtale

1

Creo que se le olvidó agregar m_listView al RelativeLayout o m_listView 's visibilidad sería GONE.

¿Puedes comprobarlo?

+0

El XML muestra el diseño. – dreamtale

+0

Como puedo ver, está configurando parámetros de diseño de diseño relativo, pero está agregando el botón en el diseño lineal. Eiter utiliza LinearLayout.LayoutParams en lugar de RelativeLayout.LayoutParams o método de instancia addView de RelativeLayout. – bhavindesai

+0

Ver mi pregunta editada. – dreamtale

2

Si los nombres de sus variables son indicativos, es porque está agregando el widget a LinearLayout, por lo que se ignoran las etiquetas de RelativeLayout.

Esta línea es la que yo estoy hablando:

m_linearLayout.addView(button2, layoutParams); 

EDITAR

Usted dice alignParentRight obras ... la única diferencia que hay es que ot no toma un parámetro de anclaje . Tal vez m_listView.getId() no devuelve la identificación correcta. Podría avanzar con el depurador y ver si está devolviendo un valor adecuado.

Tal vez usted podría intentar llamar la identificación específica ...

layoutParams.addRule(RelativeLayout.LEFT_OF, R.id.list); 
+0

¿Quieres decir que debería usar linearlayout? ¿Me puede dar más detalles? – dreamtale

+0

No, me refiero a que necesita agregar una vista a un RelativeLayout para que las reglas de RelativeLayout funcionen. Esa referencia de vista dice 'm_linearlayout', que me dice que estás tratando de agregar la vista a LinearLayout en lugar de a RelativeLayout. Como no has mostrado dónde estableces la referencia 'm_linearlayout', asumo que estás usando un nombre apropiado. A menos que tenga 'm_linearlayout = (RelativeLayout) this.findViewById (R.id.parent)' en algún lugar, en cuyo caso diría que ha elegido un nombre de referencia muy pobre para su diseño relativo. – Barak

+0

Disculpe por eso, lo probé en un proyecto anterior, y simplemente reemplazo el 'LinearLayout' por' RelativeLayout' y no cambio el nombre de la variable. He editado la pregunta. – dreamtale

1

setIdi se llama a antes de la alineación, especialmente para la nueva vista de objetos.

0

Si está utilizando un ID personalizado y no un ID de Android generado regularmente (por ejemplo, R.id.my_id), asegúrese de que el ID no sea igual a 0 (o negativo), de lo contrario la regla será ignorada.

2

Para realizarlo, utilice la vista predefinida ID o declare una. En valores carpeta crear ids.xml continuación, agregar un artículo así:

<item name="imageViewID" type="id"/> 

uso este id en el código que va a crear nueva instancia de vista como esta:

RelativeLayout layout=new RelativeLayout(context); 

ImageView imageView = new ImageView(context); 
imageView.setId(R.id.imageViewID); 

RelativeLayout.LayoutParams layoutParams = new LayoutParams(50, 50); 
layoutParams.addRule(RelativeLayout.CENTER_HORIZONTAL); 
layout.addView(imageView, layoutParams); 

TextView textView = new TextView(context); 

RelativeLayout.LayoutParams textViewParams= new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
textViewParams.addRule(RelativeLayout.CENTER_HORIZONTAL); 
textViewParams.addRule(RelativeLayout.BELOW, imageView.getId()); 
layout.addView(nameView, nameLayoutParams); 

o podemos usar directamente esta función View.generateViewId() para realizar lo mismo. De esta manera:

imageView.setId(View.generateViewId());