Disposition Android avec ListView et boutons

101

D'accord, cette mise en page spécifique me dérange. Et je n'arrive pas à trouver un moyen d'avoir un listView, avec une rangée de boutons en bas pour que la liste ne s'étende pas au-dessus des boutons, et ainsi les boutons sont toujours alignés au bas de l'écran. Voici ce que je veux:

Suppression du lien ImageShack mort

Il semble que cela devrait être si facile, mais tout ce que j'ai essayé a échoué. De l'aide?

Voici mon code actuel:

    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);
Kleptine
la source
Bonne question, beaucoup de développeurs vont rester coincés là-dessus.
Signcodeindie
Heureusement, le concepteur d'Android est en fait assez gentil. Par conséquent, lors de la création d'une mise en page / d'une interface utilisateur, essayez d'utiliser Designer / XML. Surtout pour ce scénario puisqu'il ne s'agit que d'un ensemble de boutons et d'un ListView.
Soumis

Réponses:

137

Je pense que c'est ce que vous recherchez.

<?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
la source
C'est ce que j'utilise essentiellement, même si j'écris la mise en page en Java. La listView s'étend toujours sur les boutons.
Kleptine
1
La seule chose que je change est que j'ajoute un relativeLayout autour de ListView car je ne peux pas appeler addRule (RelativeLayout.ABOVE) sur un ListView.
Kleptine
2
Ce code devrait fonctionner correctement. android:layout_above="@id/testbutton"conservera ce qui ListViewprécède le Button.
CommonsWare
Lorsque j'utilise cela, la liste s'arrête au-dessus du bouton, puis commence à faire défiler en interne.
lars
7
Vous n'appelez pas non plus addRule(RelativeLayout.ABOVE)un RelativeLayout. Vous l'appelez sur un RelativeLayout.LayoutParams. Vous ajoutez ensuite le ListViewau RelativeLayout, en fournissant cela RelativeLayout.LayoutParams. Veuillez envisager de passer à XML et de le gonfler, pour une maintenance à long terme.
CommonsWare
57

J'ai eu le même problème depuis des lustres.

La solution pour garder le ListView au-dessus des boutons, mais l'empêcher de les couvrir lorsque la liste est longue, est de définir android: layout_weight = "1.0" sur le ListView. Laissez layout_weight sur les boutons non défini afin qu'ils restent à leur taille naturelle, sinon les boutons seront mis à l'échelle. Cela fonctionne avec LinearLayout.

Il y a un exemple dans les ApiDemos Android: ApiDemos / res / layout / linear_layout_9.xml

David Ingram
la source
économisez-moi encore quelques heures. Je ne pouvais pas comprendre pourquoi les boutons ne sont jamais apparus. :)
frostymarvelous
Je ne comprends pas complètement pourquoi cela fonctionne, mais cela fonctionne :)
Bevor
20

Je cherchais juste une réponse à cette question et ce fut l'un des premiers résultats. J'ai l'impression que toutes les réponses, y compris celle qui est actuellement choisie comme «meilleure réponse», ne traitent pas du problème sur lequel porte la question. Le problème qui est énoncé est qu'il y a un chevauchement des deux composants Buttonet ListViewen ce que le ListView occupe tout l'écran, et le Button flotte visuellement au-dessus (devant) le ListView (blocage de la vue / de l'accès du dernier article dans le ListView)

Sur la base des réponses que j'ai vues ici et sur d'autres forums, je suis finalement arrivé à une conclusion sur la façon de résoudre ce problème.

À l'origine, j'avais:

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

Notez l'utilisation de RelativeLayoutcomme nœud racine.

Il s'agit de la dernière version de travail dans laquelle le bouton ne chevauche pas 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>

Il n'y a que deux différences. Tout d'abord, je suis passé à l'utilisation d'un LinearLayout. Cela aidera avec le bit suivant, qui ajoutait android:layout_weightà monListView

J'espère que ça aide.

Dallas
la source
Cela résout, mais qui devinerait!? Lorsque vous donnez à l' android:layout_alignParentBottomintérieur d'un LinearLayoutparent, ADT dit "Paramètre de mise en page non valide dans un LinearLayout: layout_alignParentBottom"!
Aswin Kumar
8

Le meilleur moyen est une disposition relative qui définit les boutons sous la liste. Dans cet exemple, les boutons sont également dans une disposition linéaire car il est plus facile de les mettre côte à côte à une taille égale.

<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
la source
Le problème est qu'il s'étend au-dessus des boutons en bas si la liste est trop longue, cependant. Je n'arrive pas à comprendre comment l'arrêter au-dessus des boutons.
Kleptine
2
Si vous utilisez (je pense 1.5, peut-être même 1.6), vous DEVEZ avoir les boutons AVANT le ListView lorsque vous utilisez les règles RelativeLayout - sinon, la mise en page ne connaît pas encore les boutons car elle les lit dans l'ordre, c'est pourquoi votre ListView s'étend apres eux.
Tim H
Cela ne fonctionne pas pour moi. Comme le dit Tim H, pour moi, je dois mettre le ListView après le LinearLayout, puis faire le layout_above ListView, comme la réponse de repoc ci-dessus.
Nemi
cela ne fonctionnera pas, le bouton ne sera pas à l'écran et ne
défilera
1

Je sais que cet article est assez ancien, mais, pour répondre à la question de l'affiche originale, la raison pour laquelle le code n'a pas fonctionné était boutons.getId () renvoie -1. Si vous comptez faire cela, vous devez définir faire quelque chose comme call buttons.setId (10). Si vous faites cela, le code fonctionne très bien.

Doo Dah
la source
0

cela devrait fonctionner. pour avoir des boutons au-dessus de la liste, placez les boutons dans une autre disposition linéaire.

<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
la source
0

la solution la plus simple serait de créer deux mises en page linéaires, l'une avec le bouton et l'autre avec la vue de liste (envelopper le contenu sur la hauteur du bouton et faire correspondre le parent sur la hauteur de la mise en page de la liste). alors ne faites qu'une vue de défilement sur la disposition avec la vue de liste et la disposition de bouton sera ignorée. j'espère que ça aide, désolé je n'avais pas envie d'écrire le code.

Pete
la source