linearlayout - Problemas de comprensión de Android XML layout_weight
relativelayout android developers (4)
Realmente lo intenté, pero no puedo entender cómo interpreta Android la configuración de 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 texto de edición y un botón
- una parte de contenido en el medio que toma todo lo que queda del espacio
Al escribir, me gustaría aumentar el EditText a una altura específica y comenzar a desplazar si el texto ingresado excede la altura disponible. Haciendo esto necesito el LinearLayout
circundante para crecer junto con el EditText.
Si defino una altura específica para el LinearLayout
interno, no crecerá. Si no lo hago, el diseño interno ocupa TODO el espacio en lugar de ScrollView, sin importar lo que intente usar layout_weight
. :(
Mi XML actual se ve así:
<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>
Cualquier consejo es muy apreciado!
Creo que estarías mejor con un RelativeLayout. Agregue su encabezado y layout_alignParentTop="true"
en layout_alignParentTop="true"
. Luego agregue su EditText y Button, establezca esa área en layout_alignParentBottom="true"
. Luego, agregue el área central, establezca el ancho y el alto en fill_parent
, y establezca 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 debería funcionar.
He tenido un problema similar (un pie de página con la marca de tiempo de actualización pegada a la parte inferior de la pantalla y un ListView / ScrollView ocupando todo el espacio restante) y después de muchos intentos me funcionó con el siguiente diseño:
<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>
Sin recortar el ListView cuando está con una rueda de desplazamiento, alineación perfecta en todas las orientaciones, mostrando correctamente el texto "la lista está vacía".
layout_weight
se utiliza para determinar cómo Android divide el espacio restante después de que los distintos widgets obtengan todo el espacio que desean.
Entonces, digamos que tiene 3 widgets en una fila, cada uno de los cuales quiere 10 píxeles, pero tiene 50 píxeles de espacio. Aquí hay algunos ejemplos de layout_weights y la cantidad de píxeles que reclamará cada widget:
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
Puedes pensar en el peso como un porcentaje del espacio disponible. Sumará todos los valores y luego entregará las partes según corresponda. Por lo tanto, si le ayuda, puede usar pesos que suman 100 para hacer porcentajes:
widget1: weight = 0, 10px
widget2: weight = 25, 15px
widget3: weight = 75, 25px
Si entiendo correctamente, desea que el widget inferior comience en un tamaño particular, luego expanda a un tamaño máximo si es necesario, y luego desplace.
Y, quieres que el widget que está sobre él se haga cargo de todo el espacio extra.
Desafortunadamente en Android no es realmente posible especificar un tamaño máximo. Creo que lo mejor que podrías hacer sería darle a ScrollView un tamaño fijo, con un layout_weight = 1 y decirle a LinearLayout el fondo para wrap_content. Esto (creo) causaría que LinearLayout se expanda hasta que ya no pueda, porque ScrollView ya ha reclamado el espacio.
Sin embargo, el desafío está especificando un tamaño fijo para ScrollView que tiene sentido en todos los diferentes tamaños de pantalla y resoluciones. Podría terminar teniendo que crear diferentes diseños para las diferentes resoluciones, lo que probablemente no valga la pena. Personalmente, le daría al editText un tamaño fijo ...
<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á