2010-09-17 26 views
16

Realmente traté, pero no puedo entender cómo interpreta Android layout_weight entorno ...problemas para entender XML Android layout_weight

Lo que estoy tratando de lograr es

  • un encabezado en la parte superior con una altura fija
  • un área de entrada en la parte inferior que contiene un EditarTexto y un botón
  • una parte de contenido en el medio que se está tomando todo lo que queda de espacio

Al escribir me gustaría hacer crecer EditText a una altura específica y comenzar a desplazarme si el texto ingresado excede la altura disponible. Para hacer esto, necesito el entorno LinearLayout para crecer junto con EditText.

Si defino una altura específica para el interior LinearLayout, no crecerá. Si no lo hago, el diseño interior toma TODO el espacio en lugar de ScrollView, sin importar lo que intento usar layout_weight. :(

Mi XML actual se parece a lo siguiente:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 
    <TextView 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="I'm a header" /> 
    <ScrollView 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_weight="1" 
     android:gravity="bottom"> 
     <LinearLayout 
      android:id="@+id/itemContainer" 
      android:orientation="vertical" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" /> 
    </ScrollView> 
    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:padding="2dp" 
     android:gravity="bottom" 
     android:isScrollContainer="true" 
     android:background="@drawable/steel" > 
     <EditText 
      android:id="@+id/edittext01" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.2" 
      android:scrollbars="vertical" 
      android:fadingEdge="vertical" 
      android:fadingEdgeLength="60dp" 
      android:maxHeight="40dp" 
      android:textSize="15sp" /> 
     <Button 
      android:id="@+id/button" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="0.8" 
      android:layout_gravity="right" 
      android:text="Send" 
      android:textStyle="bold" 
      android:textSize="15sp" /> 
    </LinearLayout> 
</LinearLayout> 

Algún consejo son muy apreciadas

Respuesta

37

layout_weight se usa para determinar cómo Android divide el espacio sobrante después de que los distintos widgets obtengan todo el espacio que desean.

Supongamos que tiene 3 widgets seguidos, cada uno de los cuales quiere 10 píxeles, pero tiene 50 píxeles de espacio. Aquí hay algunos ejemplos de layout_weights y el número de píxeles cada widget reclamará:

widget1: weight = 1, 30px 
widget2: weight = 0, 10px 
widget3: weight = 0, 10px 

widget1: weight = 1, 20px 
widget2: weight = 1, 20px 
widget3: weight = 0, 10px 

widget1: weight = 1, 16.5px 
widget2: weight = 1, 16.5px 
widget3: weight = 1, 16.5px 

Se puede pensar en el peso como un porcentaje del espacio disponible. Sumará todos los valores y luego distribuirá las porciones según corresponda. Por lo tanto, si ayuda se puede utilizar pesos que se suman a 100 hacer porcentajes:

widget1: weight = 0, 10px 
widget2: weight = 25, 15px 
widget3: weight = 75, 25px 

Si he entendido bien, desea que el widget de abajo para empezar a un tamaño determinado, a continuación, expanda hasta cierto tamaño máximo si es necesario , y luego desplazarse.

Y, desea que el widget de arriba tome todo el espacio adicional.

Desafortunadamente en Android no es posible especificar un tamaño máximo. Creo que lo mejor que podrías hacer es darle a ScrollView un tamaño fijo, con un layout_weight = 1 y decirle LinearLayout a wrap_content. Esto (creo) hará que LinearLayout se expanda hasta que ya no pueda, porque ScrollView ya ha reclamado el espacio.

Sin embargo, el reto es especificar un tamaño fijo para ScrollView que tenga sentido en todos los diferentes tamaños de pantalla y resoluciones. Puede terminar teniendo que crear diferentes diseños para las diferentes resoluciones, lo que probablemente no valga la pena. Personalmente, le daría un tamaño fijo al editText ...

+0

Gracias Mayra. Eso es exactamente lo que trato de hacer. Quizás kcoppock tenga otra idea. Si tiene que ser, terminaré creando diseños para diferentes soluciones. :(Configurar ScrollView en un tamaño específico Y al agregar layout_weight = 1, ScrollView tomará todo el espacio que puede obtener y se "encogerá" a su tamaño definido tan pronto como otro widget tome más espacio, ¿no? – stpn108

+2

Sí, eso es la idea. –

+1

Suena bien.Creo que hay un atributo setMultiLine para EditTexts. Si configura eso, y establece la altura en wrap_content, estoy bastante seguro de que se ampliará para ajustarse, y reducirá el ScrollView en consecuencia. – kcoppock

1

Creo que sería mejor con un RelativeLayout Añadir su cabecera, y la puso a layout_alignParentTop="true"!. . Publique sus EditarTexto y Button, establece esa zona para layout_alignParentBottom="true". a continuación, añadir el área central, establecer el ancho y la altura a fill_parent, y establecer layout_above="{the id of the EditText/Button layout}" y layout_below="{the id of the header layout}".

No tengo Eclipse en el trabajo, de lo contrario lo probaría por ti, pero eso debería funcionar.

+0

Muchas gracias, kcoppock! Lo probaré dentro de una o dos horas y te dejaré saber si funciona. – stpn108

+0

Hm, realmente no cambió nada. Solo el encabezado desapareció. ;) Si utilizo LinearLayout nuevamente, el encabezado vuelve. Mantuve 'layout_alignParentTop = "true"' y 'layout_alignParentBottom = "true"' como sugirió. Tan pronto como configuro el 'LinearLayout' interno como 'layout_height = "wrap_content"' ocupa la mitad de la pantalla. Además, no entiendo por qué EditText toma el 80% del ancho dentro de LinearLayout, ya que está definido para tener 'layout_weight = "0.2"'. Pero esa no es la pregunta aquí ...;) – stpn108

+0

¿Podría publicar lo que intentó en un enlace pastebin.com? ¿O simplemente edítalo en la publicación original? Puedo echarle un vistazo y ver si salta algo. Ah, también, el peso del diseño debería ser solo enteros, creo. Si recuerdo correctamente, todos los pesos de diseño definidos deberían sumar hasta 10. Entonces, un peso de 2 es 20%. Sin embargo, podría estar equivocado en eso. – kcoppock

3

Tuve un problema similar (un pie de página con la marca de tiempo de actualización pegada en la parte inferior de la pantalla y un ListView/ScrollView ocupando todo el resto) espacio) y después de muchos intentos que trabajó para mí usando la siguiente distribución:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent"> 

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_above="@+id/refresh_date_text" 
       android:layout_alignParentTop="true" 
       android:orientation="vertical" 
       > 

    <ListView android:id="@android:id/list" android:layout_width="fill_parent" 
     android:layout_height="fill_parent" android:background="#FFFFFF" 
     android:layout_weight="1" android:divider="@drawable/list_divider" 
     android:dividerHeight="1dp" android:drawSelectorOnTop="false" /> 

    <TextView android:id="@android:id/empty" 
       android:layout_width="match_parent" 
       android:layout_height="match_parent" 
       android:background="#ffffff" 
       android:gravity="center_horizontal" 
       android:paddingTop="10dp" 
       android:text="The list is empty."/> 

</LinearLayout> 

<TextView android:id="@+id/refresh_date_text" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignParentBottom="true" 
      android:gravity="center_horizontal" 
      android:background="#f0f0f0" 
      android:textStyle="italic" 
      android:textSize="12dp" 
      /> 
</RelativeLayout> 

No se recorte el ListView cuando con una rueda de desplazamiento, la alineación perfecta en todas las orientaciones, mostrando correctamente la "lista está vacía" de texto.

-1
<LinearLayout 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:weightSum="1" 
> 
<TextView 
android:text=" TextView " 
android:textColor="#ffffff" 
android:textSize="15sp" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:background="#ff0000" 
/> 
<EditText 
    android:text=" EditText " 
    android:textSize="15sp" 
    android:layout_width="250dp" 
    android:layout_weight="1" 
    android:layout_height="0dp" 
    /> 
<Button 
    android:text=" button " 
    android:textColor="#000000" 
    android:textSize="15sp" 
    android:gravity="center_vertical|center_horizontal" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    /> 
    </LinearLayout> 

Esto ayudará

+0

sin ofender, tal vez no entiendo lo que estás tratando de hacer con este XML, pero no veo cómo esto podría ayudar con el problema inicial. podrías aclarar un poco? – stpn108

Cuestiones relacionadas