Diseño de Android con ListView y Botones


Bien, este diseño específico me está molestando. Y parece que no puede encontrar una manera de tener una ListView, con una fila de botones en la parte inferior para que la listview no se extienda sobre la parte superior de los botones, y por lo que los botones siempre se ajustan a la parte inferior de la pantalla. Esto es lo que quiero:

removed dead ImageShack link

Parece que debería ser tan fácil, pero todo lo que he intentado ha fallado. Alguna ayuda?

Aquí está mi código actual:

    RelativeLayout container = new RelativeLayout(this);
    container.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));

    //** Add LinearLayout with button(s)

    LinearLayout buttons = new LinearLayout(this);

    RelativeLayout.LayoutParams bottomNavParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    bottomNavParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
    bottomNavParams.addRule(RelativeLayout.CENTER_HORIZONTAL);
    buttons.setLayoutParams(bottomNavParams);


    ImageButton newLayer = new ImageButton(this);
    newLayer.setImageResource(R.drawable.newlayer);
    newLayer.setLayoutParams(new LinearLayout.LayoutParams(45, LayoutParams.FILL_PARENT));
    buttons.addView(newLayer);

    container.addView(buttons);

    //** Add ListView

    layerview = new ListView(this);

    RelativeLayout.LayoutParams listParams = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT);
    listParams.addRule(RelativeLayout.ABOVE, buttons.getId());

    layerview.setLayoutParams(listParams);

    container.addView(layerview);
Author: SuperBiasedMan, 2010-03-05

7 answers

Creo que esto es lo que estás buscando.

<?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">

    <Button android:layout_width="fill_parent"
        android:layout_height="wrap_content" android:id="@+id/testbutton"
        android:text="@string/hello" android:layout_alignParentBottom="true" />

    <ListView android:layout_width="fill_parent"
        android:layout_height="fill_parent" android:id="@+id/list"
        android:layout_alignParentTop="true" android:layout_above="@id/testbutton" />

</RelativeLayout>
 135
Author: lars,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-05 01:24:24

Tuve el mismo problema durante años.

La solución para mantener la ListView por encima de los botones, pero evitando que los cubra cuando la lista es larga, es establecer android:layout_weight="1.0" en la ListView. Deje el layout_weight en los botones sin configurar para que permanezcan en su tamaño natural, de lo contrario los botones se escalarán. Esto funciona con LinearLayout.

Hay un ejemplo en el Android ApiDemos: ApiDemos/res/layout/linear_layout_9.xml

 57
Author: David Ingram,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-12-06 15:46:27

Estaba buscando una respuesta a esta pregunta y este fue uno de los primeros resultados. Siento que todas las respuestas, incluida la que actualmente se elige como la "mejor respuesta", no abordan el tema sobre el que se pregunta. El problema que se está planteando es que hay una superposición de los dos componentes Button y ListView en que la ListView está ocupando toda la pantalla, y el Botón está flotando visualmente encima (delante de) la ListView (bloqueando la vista / acceso de la última item in the ListView)

Basado en las respuestas que he visto aquí y en otros foros, finalmente llegué a una conclusión sobre cómo resolver esto.

Originalmente, tenía:

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

  <ListView
    android:id="@+id/game_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    />

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    style="@android:style/ButtonBar">

    <Button
      android:id="@+id/new_game"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/new_game"
      android:textColor="#FFFFFFFF"
      android:background="@drawable/button_background" />
  </LinearLayout>

</RelativeLayout>

Tenga en cuenta el uso de RelativeLayout como nodo raíz.

Esta es la versión final de trabajo en la que el Botón no se superpone con el ListView:

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

  <ListView
    android:id="@+id/game_list"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentTop="true"
    android:layout_weight="1.0" />

  <LinearLayout
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    style="@android:style/ButtonBar">

    <Button
      android:id="@+id/new_game"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="@string/new_game"
      android:textColor="#FFFFFFFF"
      android:background="@drawable/button_background" />
  </LinearLayout>

</LinearLayout>

Solo hay dos diferencias. Primero, he cambiado a usar un LinearLayout. Esto ayudará con el siguiente bit, que estaba agregando android:layout_weight a mi ListView

Espero que esto ayude.

 20
Author: Dallas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-06-15 12:25:14

La mejor manera es un diseño relativo que establezca los botones debajo de la vista de lista. En este ejemplo, los botones también están en un diseño lineal porque es más fácil ponerlos uno al lado del otro en un tamaño igual.

<RelativeLayout android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent">

<ListView android:id="@+id/ListView01" 
android:layout_alignParentTop="true"
android:layout_width="fill_parent" 
android:layout_height="fill_parent">
</ListView>

<LinearLayout android:id="@+id/LinearLayout01" 
android:layout_below="@+id/ListView01" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:layout_alignParentBottom="true">
<Button android:id="@+id/ButtonJoin" 
android:text="Join"
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_alignParentBottom="true">
</Button>
<Button android:id="@+id/ButtonJoin" 
android:layout_alignRight="@id/ButtonCancel" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel"
android:layout_alignParentBottom="true">
</Button>
</LinearLayout>

</RelativeLayout>
 8
Author: Patrick Kafka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-05 01:10:24

Sé que este post es bastante antiguo, pero, para responder a la pregunta del poster original, la razón por la que el código no funcionó fueron los botones.getId () devuelve -1. Si va a hacer esto, debe configurar hacer algo como botones de llamada.setId(10). Si haces eso, el código funciona bien.

 1
Author: Doo Dah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-15 18:30:15

Esto debería funcionar. para tener botones encima de la vista de lista también, ponga los botones dentro de otro diseño lineal.

<LinearLayout> main container // vertical

<LinearLayout> scrollview must be contained in a linear layout //vertical - height to fill parent

    <ScrollView> set the height of this to fill parent

        <ListView> will be contained in the scrollview
        </ListView>

    </ScrollView>

</LinearLayout>

<LinearLayout> //horizontal - height to wrap content

<Button>

</Button>

</LinearLayout>

</LinearLayout>
 0
Author: Rhys,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-08 17:57:22

La solución más fácil sería crear dos diseños lineales, uno con el botón y el otro con la vista de lista(Ajustar el contenido en la altura del botón y hacer coincidir el padre en la altura del diseño de la lista). entonces solo haga una vista de desplazamiento sobre el diseño con la vista de lista y el diseño de botón será ignorado. espero que ayude, siento no tener ganas de escribir el código.

 0
Author: Pete,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-09 19:20:53