2011-10-08 10 views
7

¿Por qué mi disposición relativa ocupan ancho de la pantalla completa¿Por qué la disposición relativa ocupan ancho de la pantalla completa

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="#f00" 
    > 
    <Button 
     android:id="@+id/Button01" 
     android:text="Press Here" 
     android:layout_alignParentRight="true" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"></Button> 
    <Button 
     android:id="@+id/Button02" 
     android:text="02" 
     android:layout_alignParentLeft="true" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"></Button> 
</RelativeLayout> 

he especificado la disposición relativa a "wrap_content", entonces ¿por qué se ocupan espacio en la pantalla completa. Out put es el mismo incluso si digo android: layout_width = "fill_parent". Enlighten

aclararme por favor!

EDIT: Creo que no estaba muy claro con mi pregunta anterior. Disculpas por eso. Cuando tengo 2 puntos de vista del niño en una disposición relativa y uno de ellos está alineado a la izquierda a los padres y otro está alineado a la derecha y el ancho diseños relativa es WRAP_CONTENT entonces espera que el ancho de diseños para ser sólo la suma de ancho de 2 botones (ISN' t eso es lo que WRAP_CONTENT significa ??). Sé que hay otras formas de lograr la interfaz de usuario que busco, pero estoy tratando de entender estas etiquetas de diseño relativo correctamente.

EDIT 2: He experimentado un poco y parece que si usamos Layout_AlighParentRight con el ancho de su padre como WRAP_CONTENT, entonces el ancho de la disposición superior se usa para el cálculo (como algunas de las respuestas que se indican a continuación). Pero estamos utilizando solo Layout_alignParentLeft, luego funciona como se espera y el ancho de la disposición no se extiende a la pantalla completa. Gracias por ayudar a la gente!

Respuesta

13

Las otras respuestas han señalado correctamente que cuando el ancho de su diseño relativo está establecido en wrap_content, y sus hijos están alineados a la izquierda y derecha, el diseño relativo toma el ancho de su elemento primario, en este caso, toda la pantalla . Sin embargo, si ambos niños estuvieran alineados a un lado, el diseño relativo sería tan ancho como el más ancho.

Ahora, si desea que los dos botones se coloquen uno al lado del otro, y la disposición relativa sea tan amplia como la suma de los anchos de los botones, se necesita un enfoque ligeramente diferente. En lugar de colocar ambos botones en relación con el elemento principal, hágalo con un solo botón (por ejemplo, el primero). Digamos que su posición no se modifica (android:layout_alignParentRight="true"). Ahora el botón está flotado hacia la derecha, por lo que el segundo botón, para ubicarse al lado, debe estar alineado con el lado izquierdo del primer botón. Por lo tanto, solo agregamos android:layout_toLeftOf="@id/Button01" (y eliminamos la parte android:layout_alignParentLeft="true").

Para más, le sugiero que consulte a cabo un tutorial muy amable en relative layouts.

+0

Gracias por la respuesta Ernesta! dejó las cosas un poco claras ahora. Pero todavía estoy un poco sorprendido con por qué los diseños relativos se fijan en el ancho de sus padres si sus hijos están alineados en los bordes izquierdo y derecho. ¡Y felicitaciones por llegar a la fama! – Santosh

+3

Gracias :). Piénselo de esta manera: 'wrap_content' significa * sea tan ancho como el espacio que ocupen los hijos. * Ahora, si toma un hijo y dice' alignParentRight', se supone que va a la derecha de su padre. Pero, ¿qué tan amplio es el padre? Bueno, * tan amplio como el espacio que ocupan los propios hijos. * En otras palabras, el padre deja la decisión de su ancho a sus hijos. Y los hijos no están limitados por sus padres, por lo que van hasta el final, que es el contenedor de los padres. – ernes7a

+0

Buena explicación. ¡Gracias! – Santosh

1

Esta línea hace que el botón (Button01) "Presione aquí" alinear a la derecha:

android:layout_alignParentRight="true" 

que hace que su diseño llenar el padre de ancho.

3

causa que tiene un ancho

 android:layout_alignParentLeft="true" 

un objeto, y una anchura

 android:layout_alignParentRight="true" 

otro objeto, entonces el diseño se extiende a ambos lados, que le da el diseño de ancho completo.

Pero cuando usa Layout_alignParentXXXXX, y coloca el padre WRAP_CONTENT, eso hace que los niños vayan al diseño superior con un ancho definido.

+0

Gracias por la respuesta, pero no es muy claro para mí. ¿Está diciendo que si usamos Layout_alignParentXXXX y que el ancho de los padres es WRAP_CONTENT, entonces el ancho de la disposición superior (padre principal) se usa para el cálculo? ¿es eso cierto? – Santosh

+0

mi experiencia me lo dijo, pero puedes intentarlo, poniendo otro LinearLayout superior con un ancho de ejemplo de 50 dips y ver el resultado :) –

+0

He experimentado un poco y parece que si usamos Layout_AlighParentRight con el ancho de sus padres como WRAP_CONTENT entonces el ancho de la disposición superior se usa para el cálculo (como usted señaló). Pero estamos utilizando solo Layout_alignParentLeft, luego funciona como se espera y el ancho de la disposición no se extiende a la pantalla completa. Gracias por la ayuda de Quiroga! – Santosh

0

Otro problema que puede enfrentar es que si configura sus 2 hijos para "alinear el elemento primario derecho" + "contenido_conjunto", y su diseño relativo como "contenido_concluso", y ese diseño relativo está en una pantalla completa. el diseño ocupará todo el ancho de LinearLayout.

Si hace eso con "alinear matriz izquierda", la disposición relativa se pega a la izquierda, y su ancho es realmente un "contenido envolvente". Pero el comportamiento es diferente para "alinear el padre correcto", eso es un poco extraño.

Solución:

para resolver ese problema (que tenía para alinear uno de los niños a la derecha), de hecho me puse los 2 niños a "alinear los padres izquierda" y jugó con los niños de relleno con el fin de pon a uno de los niños en la esquina superior derecha. Esta es una solución sucia, pero la única que he encontrado por ahora.

Posibles soluciones más limpias:

Otro truco sería poner 2 LinearLayout dentro de un FrameLayout, a continuación, poner a sus hijos reales en cada LinearLayout, y jugar con la gravedad de esos LinearLayout para colocar a los niños en la posición correcta .

  • RelativeLayout
    • LinearLayout
      • Niño 1 (wrap_content)
    • LinearLayout (gravedad: arriba a la derecha)
      • Child 2 (wrap_content)
Cuestiones relacionadas