Diseño de Android con ListView y botones

101

Muy bien, este diseño específico me está molestando. Y parece que no puedo encontrar una manera de tener una vista de lista, con una fila de botones en la parte inferior para que la vista de lista no se extienda por encima de los botones, por lo que los botones siempre se ajustan a la parte inferior de la pantalla. Esto es lo que quiero:

eliminado enlace de ImageShack muerto

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);
Cleptina
fuente
Buena pregunta, muchos desarrolladores se quedarán atascados en esto.
Signcodeindie
Afortunadamente, el diseñador de Android es bastante bueno. Por lo tanto, al crear un diseño / UI, intente utilizar Designer / XML. Especialmente para este escenario, ya que es simplemente un conjunto de botones y un ListView.
Subby

Respuestas:

137

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>
lars
fuente
Eso es lo que básicamente he estado usando, aunque estoy escribiendo el diseño en Java. El listView todavía se extiende sobre los botones.
Kleptine
1
Lo único que estoy cambiando es que estoy agregando un diseño relativo alrededor de ListView porque no puedo llamar a addRule (RelativeLayout.ABOVE) en un ListView.
Kleptine
2
Este código debería funcionar bien. android:layout_above="@id/testbutton"mantendrá lo ListViewanterior el Button.
CommonsWare
Cuando uso esto, obtengo que la lista se detenga encima del botón y luego empiece a desplazarme internamente.
lars
7
Tampoco llamas addRule(RelativeLayout.ABOVE)a un RelativeLayout. Lo llamas en un RelativeLayout.LayoutParams. Luego agrega el ListViewal RelativeLayout, proporcionando eso RelativeLayout.LayoutParams. Considere cambiar a XML e inflarlo, para un mantenimiento a largo plazo.
CommonsWare
57

Tuve el mismo problema durante años.

La solución para mantener ListView encima de los botones, pero evitar que los cubra cuando la lista es larga, es configurar android: layout_weight = "1.0" en 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 Android ApiDemos: ApiDemos / res / layout / linear_layout_9.xml

David Ingram
fuente
sólo ahórrame un par de horas más. No pude entender por qué nunca aparecieron los botones. :)
frostymarvelous
No entiendo completamente por qué esto funciona, pero funciona :)
Bevor
20

Solo estaba buscando una respuesta a esta pregunta y este fue uno de los primeros resultados. Siento que todas las respuestas, incluida la que se elige actualmente como la "mejor respuesta", no abordan el tema sobre el que se pregunta. El problema que se indica es que hay una superposición de los dos componentes Buttony ListViewen que ListView ocupa toda la pantalla, y el Botón flota visualmente encima (delante de) ListView (bloqueando la vista / acceso de la última artículo en el 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 RelativeLayoutcomo nodo raíz.

Esta es la versión final y funcional en la que el botón no se superpone a 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, cambié a usar un LinearLayout. Esto ayudará con el siguiente bit, que se agregó android:layout_weighta miListView

Espero que esto ayude.

Dallas
fuente
Esto se resuelve, pero ¿quién lo adivinaría? Cuando da android:layout_alignParentBottomdentro de un LinearLayoutpadre, ADT dice "Parámetro de diseño no válido en un LinearLayout: layout_alignParentBottom".
Aswin Kumar
8

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

<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>
Patrick Kafka
fuente
Sin embargo, el problema es que se extiende por encima de los botones en la parte inferior si la vista de lista es demasiado larga. No sé cómo hacer que se detenga por encima de los botones.
Kleptine
2
Si está usando (creo que 1.5, tal vez incluso 1.6), DEBE tener los botones ANTES de ListView cuando use las reglas de RelativeLayout; de lo contrario, el diseño aún no conoce los Botones porque los lee en orden, razón por la cual su ListView se extiende más allá de ellos.
Tim H
Esto no funciona para mi. Como dice Tim H, para mí debo poner ListView después de LinearLayout y luego hacer ListView layout_above, como la respuesta de repoc anterior.
Nemi
esto no funcionará, el botón no estará en la pantalla y no se desplazará
Vaibhav Mishra
1

Sé que esta publicación es bastante antigua, pero, para responder a la pregunta del póster original, la razón por la que el código no funcionó fue buttons.getId () devuelve -1. Si va a hacer esto, debe configurar hacer algo como call buttons.setId (10). Si lo hace, el código funciona bien.

Doo Dah
fuente
0

Esto debería funcionar. para tener botones encima de la vista de lista también, coloque 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>
Rhys
fuente
0

la solución más sencilla sería crear dos diseños lineales, uno con el botón y el otro con la vista de lista (ajustar el contenido a la altura del botón y hacer coincidir el padre con la altura del diseño de la lista). luego solo haga una vista de desplazamiento sobre el diseño con la vista de lista y se ignorará el diseño de los botones. Espero que ayude, lo siento, no tuve ganas de escribir el código.

Pete
fuente