2011-05-04 18 views
21

Tengo una distribución relativa con tres linearlayouts como niños. El último tiene una altura fija y tiene android: layout_alignParentBottom establecido en "true". Mientras que la del medio está posicionada correctamente debajo de la primera, llega hasta la parte inferior de la pantalla, de modo que su parte inferior se solapa con la tercera.¿Cómo hacer que una distribución lineal llene el espacio restante en un diseño relativo?

¿Qué pasa?

Gracias

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <LinearLayout 
     android:id="@+id/category" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:layout_alignParentTop="true" 
     android:orientation="horizontal" > 

     <ImageView 
      android:id="@+id/back_btn" 
      android:layout_width="29dp" 
      android:layout_height="34dp" 
      android:layout_gravity="center_vertical" 
      android:src="@drawable/red_arrow_left" /> 

     <TextView 
      android:id="@+id/cat_name" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:gravity="center" 
      android:textSize="20sp" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_below="@+id/category" 
     android:layout_marginTop="10dp" 
     android:orientation="horizontal" > 

     <ListView 
      android:id="@+id/android:list" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@android:color/white" 
      android:cacheColorHint="@android:color/white" /> 

     <TextView 
      android:id="@+id/android:empty" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@android:color/white" 
      android:cacheColorHint="@android:color/white" 
      android:padding="10dp" 
      android:text="@string/no_item" /> 
    </LinearLayout> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/nav_bar" 
     android:layout_width="fill_parent" 
     android:layout_height="40dp" 
     android:layout_alignParentBottom="true" 
     android:orientation="horizontal" > 
    //stuff 

    </LinearLayout> 
</RelativeLayout> 
+0

¿así que lo que quieres? – ingsaurabh

Respuesta

11

Nooo ... la solución es mucho más simple! Se olvidó de decir que desea decir que el segundo diseño lineal debe estar encima del tercero :) Sí, el segundo diseño lineal debe tener AMBOS android:layout_below="@+id/category" y android:layout_above="@+id/nav_bar". Lo probé y funciona.

Pero, por supuesto, se puede utilizar pesos para archivar los mismos resultados, que sólo va a ser más difícil ...

Su XML con el cambio que he mencionado (probado en Eclipse):

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <LinearLayout 
     android:id="@+id/category" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:layout_alignParentTop="true" 
     android:orientation="horizontal" > 

     <ImageView 
      android:id="@+id/back_btn" 
      android:layout_width="29dp" 
      android:layout_height="34dp" 
      android:layout_gravity="center_vertical" 
      android:src="@drawable/red_arrow_left" /> 

     <TextView 
      android:id="@+id/cat_name" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:gravity="center" 
      android:textSize="20sp" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_above="@+id/nav_bar" 
     android:layout_below="@+id/category" 
     android:layout_marginTop="10dp" 
     android:orientation="horizontal" > 

     <ListView 
      android:id="@+id/android:list" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@android:color/white" 
      android:cacheColorHint="@android:color/white" /> 

     <TextView 
      android:id="@+id/android:empty" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@android:color/white" 
      android:cacheColorHint="@android:color/white" 
      android:padding="10dp" 
      android:text="@string/no_item" /> 
    </LinearLayout> 

    <LinearLayout 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/nav_bar" 
     android:layout_width="fill_parent" 
     android:layout_height="40dp" 
     android:layout_alignParentBottom="true" 
     android:orientation="horizontal" > 
//stuff 

    </LinearLayout> 
</RelativeLayout> 
31

Usted podría tratar de usar los pesos de distribución para controlar los tamaños relativos de los diseños de los niños. Hay un article on my blog que brinda cierta información sobre el uso de pesos de diseño.

Como ejemplo, intentar esto:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <LinearLayout 
     android:id="@+id/category" 
     android:layout_width="fill_parent" 
     android:layout_height="50dp" 
     android:orientation="horizontal" > 

     <ImageView 
      android:id="@+id/back_btn" 
      android:layout_width="29dp" 
      android:layout_height="34dp" 
      android:layout_gravity="center_vertical" /> 

     <TextView 
      android:id="@+id/cat_name" 
      android:layout_width="fill_parent" 
      android:layout_height="wrap_content" 
      android:layout_gravity="center_vertical" 
      android:gravity="center" 
      android:textSize="20sp" /> 
    </LinearLayout> 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_below="@+id/category" 
     android:layout_marginTop="10dp" 
     android:layout_weight="1" 
     android:orientation="horizontal" > 

     <ListView 
      android:id="@+id/android:list" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@android:color/white" 
      android:cacheColorHint="@android:color/white" /> 

     <TextView 
      android:id="@+id/android:empty" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:background="@android:color/white" 
      android:cacheColorHint="@android:color/white" 
      android:padding="10dp" 
      android:text="no_item" /> 
    </LinearLayout> 

    <LinearLayout 
     android:id="@+id/nav_bar" 
     android:layout_width="fill_parent" 
     android:layout_height="40dp" 
     android:orientation="horizontal" > 
    //stuff 

    </LinearLayout> 
</LinearLayout> 

El RelativeLayout ha sido sustituido por un LinearLayout, todas las etiquetas de posicionamiento relativo se han eliminado, y un atributo layout_weight se ha agregado al centro LinearLayout que se hacer que se estire para llenar el espacio disponible.

1

Usted debe agregar un id a su segunda LinearLayout

<LinearLayout android:orientation="horizontal" 
    android:layout_width="fill_parent" android:layout_height="fill_parent"   
    android:layout_below="@+id/category" android:layout_marginTop="10dp" 
    android:@+id/YOUR_ID> 

y en la tercera disposición añadir android:[email protected]/YOUR_ID

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/nav_bar" 
    android:[email protected]/YOUR_ID 
    android:orientation="horizontal" android:layout_width="fill_parent"   
    android:layout_height="40dp" android:layout_alignParentBottom="true"> 
+0

Solo para agregar a esto, ¿por qué el 3rd LinearLayout también declara la etiqueta xmlns: android? ¿Creí que solo lo hiciste en el objeto raíz? – Klaus

+0

No vi eso :) Acabo de copiar/pegar, pero tienes razón. ¿Qué está haciendo allí? – Bastaix

Cuestiones relacionadas