Layout Android con ListView e pulsanti


101

Va bene, questo layout specifico mi sta solo infastidendo. E non riesco a trovare un modo per avere un listView, con una fila di pulsanti in basso in modo che il listview non si estenda sopra i pulsanti, e quindi i pulsanti vengono sempre agganciati alla parte inferiore dello schermo. Ecco cosa voglio:

rimosso il collegamento ImageShack morto

Sembra che dovrebbe essere così facile, ma tutto ciò che ho provato è fallito. Qualsiasi aiuto?

Ecco il mio codice attuale:

    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);

Bella domanda, molti sviluppatori rimarranno bloccati su questo.
Signcodeindie

Per fortuna, il designer in Android è in realtà piuttosto dolce. Pertanto, durante la creazione di un layout / interfaccia utente, provare a utilizzare Designer / XML. Soprattutto per questo scenario poiché è semplicemente un insieme di pulsanti e un ListView.
Subby

Risposte:


137

Penso che questo sia quello che stai cercando.

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

Questo è quello che ho usato fondamentalmente, anche se sto scrivendo il layout in Java. Il listView si estende ancora sui pulsanti.
Kleptine

1
L'unica cosa che sto cambiando è che sto aggiungendo un relativeLayout attorno a ListView perché non posso chiamare addRule (RelativeLayout.ABOVE) su un ListView.
Kleptine

2
Questo codice dovrebbe funzionare bene. android:layout_above="@id/testbutton"manterrà quanto ListViewsopra il Button.
CommonsWare

Quando lo uso, faccio in modo che l'elenco si fermi sopra il pulsante e quindi inizi a scorrere internamente.
lars

7
Non si chiama addRule(RelativeLayout.ABOVE)su un RelativeLayout, sia. Lo chiami su a RelativeLayout.LayoutParams. Quindi aggiungi il ListViewa RelativeLayout, fornendo quello RelativeLayout.LayoutParams. Si prega di considerare il passaggio a XML e gonfiarlo, per la manutenibilità a lungo termine.
CommonsWare

57

Ho avuto lo stesso problema per anni.

La soluzione per mantenere ListView sopra i pulsanti, ma impedirgli di coprirli quando l'elenco è lungo, è impostare android: layout_weight = "1.0" su ListView. Lascia il layout_weight sui pulsanti non impostato in modo che rimangano alla loro dimensione naturale, altrimenti i pulsanti verranno ridimensionati. Funziona con LinearLayout.

C'è un esempio in Android ApiDemos: ApiDemos / res / layout / linear_layout_9.xml


risparmiami solo un altro paio d'ore. Non riuscivo a capire perché i pulsanti non fossero mai apparsi. :)
frostymarvelous

Non capisco completamente perché funziona, ma funziona :)
Bevor

20

Stavo solo cercando una risposta a questa domanda e questo è stato uno dei primi risultati. Mi sento come se tutte le risposte, compresa quella attualmente scelta come "risposta migliore", non stiano affrontando il problema richiesto. Il problema che viene affermato è che c'è una sovrapposizione dei due componenti Buttone ListViewin quanto ListView occupa l'intero schermo e il Button è visivamente fluttuante sopra (di fronte a) ListView (blocco della visualizzazione / accesso dell'ultimo elemento nella ListView)

Sulla base delle risposte che ho visto qui e su altri forum, sono finalmente giunto a una conclusione su come risolvere il problema.

In origine avevo:

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

Nota l'uso di RelativeLayoutcome nodo radice.

Questa è la versione definitiva e funzionante in cui il pulsante non si sovrappone 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>

Ci sono solo due differenze. Innanzitutto, sono passato a utilizzare un file LinearLayout. Questo aiuterà con il bit successivo, che si stava aggiungendo android:layout_weightal mioListView

Spero che aiuti.


Questo risolve, ma chi lo indovinerebbe !? Quando dai android:layout_alignParentBottomall'interno di un LinearLayoutgenitore, ADT dice "Parametro di layout non valido in un LinearLayout: layout_alignParentBottom"!
Aswin Kumar

8

Il modo migliore è un layout relativo che imposta i pulsanti sotto la visualizzazione elenco. In questo esempio i pulsanti sono anche in un layout lineare perché è più facile metterli uno accanto all'altro a parità di dimensioni.

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

Il problema è che si estende sopra i pulsanti in basso se la visualizzazione elenco è troppo lunga, però. Non riesco a capire come fermarlo sopra i pulsanti.
Kleptine

2
Se stai usando (penso 1.5, forse anche 1.6) DEVI avere i pulsanti PRIMA di ListView quando usi le regole RelativeLayout - altrimenti, il layout non è ancora a conoscenza dei pulsanti perché li legge in ordine, motivo per cui il tuo ListView si estende passato loro.
Tim H

Questo non funziona per me. Come dice Tim H, per me devo mettere ListView dopo LinearLayout e quindi creare ListView layout_above, come la risposta di repoc sopra.
Nemi

questo non funzionerà, il pulsante non sarà sullo schermo e non scorrerà
Vaibhav Mishra

1

So che questo post è piuttosto vecchio, ma, per rispondere alla domanda del poster originale, il motivo per cui il codice non ha funzionato è stato buttons.getId () restituisce -1. Se hai intenzione di farlo, devi impostare qualcosa come call buttons.setId (10). Se lo fai, il codice funziona perfettamente.


0

questo dovrebbe funzionare. per avere anche i pulsanti sopra la listview, mettili in un altro layout lineare.

<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

la soluzione più semplice sarebbe creare due layout lineari, uno con il pulsante e l'altro con la visualizzazione elenco (avvolgere il contenuto sull'altezza del pulsante e abbinare il genitore all'altezza del layout dell'elenco). quindi crea solo una visualizzazione a scorrimento sul layout con la visualizzazione elenco e il layout dei pulsanti verrà ignorato. spero che aiuti, scusa non avevo voglia di scrivere il codice.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.