2010-03-05 5 views
101

D'accord, cette mise en page spécifique ne fait que m'embêter. Et ne peut pas sembler 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 donc les boutons sont toujours accrochés au bas de l'écran. Voici ce que je veux:Mise en page Android avec ListView et boutons

lien mort ImageShack enlevé

Il semble que ce 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); 
+0

Bonne question, beaucoup de dev vont rester coincés dessus. – Signcodeindie

+0

Heureusement, le concepteur d'Android est plutôt mignon. Par conséquent, lors de la création d'une disposition/interface utilisateur, essayez d'utiliser Designer/XML. Surtout pour ce scénario puisqu'il s'agit simplement d'un ensemble de boutons et d'un ListView. – Subby

Répondre

135

Je pense que c'est ce que vous cherchez.

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

C'est ce que j'ai essentiellement utilisé, même si j'écris la mise en page en Java. La listeView s'étend toujours sur les boutons. – GuyNoir

+1

La seule chose que je change est que j'ajoute un relatifLayout autour du ListView parce que je ne peux pas appeler addRule (RelativeLayout.ABOVE) sur un ListView. – GuyNoir

+2

Ce code devrait fonctionner correctement. 'android: layout_above =" @ id/testbutton "' gardera le 'ListView' au dessus de' Button'. – CommonsWare

8

La meilleure façon est une disposition relative qui fixe les boutons ci-dessous ListView. Dans cet exemple, les boutons sont également dans une disposition linéaire car il est plus facile de les mettre côte à côte à 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> 
+0

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. – GuyNoir

+2

Si vous utilisez (je pense 1.5, peut-être même 1.6) vous DEVEZ avoir les boutons AVANT ListView lors de l'utilisation des règles RelativeLayout - sinon, la mise en page n'est pas encore consciente des boutons car elle les lit dans l'ordre. passe devant eux. –

+0

Cela ne fonctionne pas pour moi. Comme Tim H dit, pour moi, je dois mettre le ListView après le LinearLayout, puis faire le layoutView_above, comme la réponse de repoc ci-dessus. – Nemi

1

Je sais ce post est assez vieux, mais, pour répondre à la question de l'affiche originale, la raison pour laquelle le code ne fonctionnait pas était retourne buttons.getId() -1. Si vous allez faire ceci, vous devez faire quelque chose comme appeler buttons.setId (10). Si vous faites cela, le code fonctionne très bien.

57

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

La solution pour conserver ListView au-dessus des boutons, mais en l'empêchant de les masquer lorsque la liste est longue, est de configurer android: layout_weight = "1.0" sur le ListView. Laissez le layout_weight sur les boutons 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

+0

juste me sauver quelques heures de plus. Je ne pouvais pas comprendre pourquoi les boutons ne sont jamais apparus. :) – frostymarvelous

+0

Je ne comprends pas complètement pourquoi cela fonctionne, mais cela fonctionne :) – Bevor

20

Je ne faisais que la recherche d'une réponse à cette question, ce qui a été l'un des premiers résultats. J'ai l'impression que toutes les réponses, y compris celle qui est actuellement choisie comme la «meilleure réponse», ne répondent pas à la question posée. Le problème qui est indiqué est qu'il y a un chevauchement des deux composants Button et ListView en ce que le ListView occupe tout l'écran, et le bouton flotte visuellement au-dessus (en face de) du ListView (vue/accès bloquant de le dernier élément dans le ListView)

Basé sur les réponses que j'ai vues ici et sur d'autres forum, je suis finalement arrivé à une conclusion sur comment résoudre ceci.

A l'origine, je devais:

<?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 RelativeLayout comme le nœud racine.

C'est la version finale de travail dans lequel le bouton ne chevauche pas la 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. D'abord, je suis passé à l'aide d'un LinearLayout.Cela aidera avec le prochain bit, qui était android:layout_weight ajoutant à mon ListView

J'espère que cela aide.

+0

Cela résout, mais qui devinerait? Lorsque vous donnez 'android: layout_alignParentBottom' à l'intérieur d'un parent' LinearLayout', ADT dit "Paramétrage de la mise en page invalide dans un LinearLayout: layout_alignParentBottom"! –

0

cela devrait fonctionner. Pour avoir aussi 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> 
0

la solution la plus simple serait de créer deux schémas linéaires, l'une avec le bouton et l'autre avec la vue de la liste (Wrap de contenu sur la hauteur du bouton et parent de match sur la hauteur de mise en page de la liste). Ensuite, faites uniquement défiler la présentation avec la vue de liste et la disposition des boutons sera ignorée. J'espère que ça aide, désolé je n'ai pas envie d'écrire le code.

Questions connexes