web-dev-qa-db-fra.com

Android: Comment pouvez-vous aligner un bouton en bas et une listview ci-dessus?

Je veux avoir un bouton au bas de la liste.

Si j'utilise relativeLayout/FrameLayout, il s'aligne mais listView descend très bas.

(Derrière le bouton en bas)

enter image description here

FrameLayout:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:orientation="vertical"
    Android:layout_width="fill_parent"
    Android:layout_height="fill_parent">
    <ListView
        Android:id="@+id/listview"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        />
    <FrameLayout
        Android:layout_width="wrap_content"
        Android:layout_height="match_parent"
        Android:layout_alignParentBottom="true">
        <Button
            Android:id="@+id/btnButton"
            Android:text="Hello"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_gravity="bottom" />
    </FrameLayout>
</FrameLayout>

Disposition relative:

<?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">
    <ListView
        Android:id="@+id/listview"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        />
    <RelativeLayout
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true">
        <Button
            Android:id="@+id/btnButton"
            Android:text="Hello"
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_gravity="bottom" />
    </RelativeLayout>
</RelativeLayout>

Les deux codes ci-dessus ne fonctionnent que comme la première image. Ce que je veux, c'est une deuxième image.

Quelqu'un peut aider?

Merci.

74
jclova

Le but de FrameLayout est de superposer des objets les uns sur les autres. Ce n'est pas ce que tu veux.

Dans votre exemple RelativeLayout, vous définissez la hauteur et la largeur de ListViews sur MATCH_PARENT cela va lui faire occuper le même espace que son parent, et ainsi occuper tout l’espace de la page (et recouvrir le bouton).

Essayez quelque chose comme:

<LinearLayout 
   Android:layout_width="match_parent" 
   Android:layout_height="match_parent" 
   Android:orientation="vertical">
  <ListView 
     Android:layout_width="match_parent" 
     Android:layout_height="0dip" 
     Android:layout_weight="1"/>
  <Button 
     Android:layout_width="match_parent" 
     Android:layout_height="wrap_content" 
     Android:layout_weight="0"/>
</LinearLayout>

Le layout_weight _ détermine l'utilisation de l'espace supplémentaire. Le Button ne veut pas s’étirer au-delà de l’espace requis, il a donc un poids de 0. Le ListView veut occuper tout l’espace supplémentaire, il a donc un poids de 1. .

Vous pouvez accomplir quelque chose de similaire en utilisant RelativeLayout, mais si ce ne sont que ces deux éléments, alors je pense qu’un LinearLayout est plus simple.

176
Cheryl Simon

J'avais besoin de deux boutons côte à côte en bas. J'ai utilisé une disposition linéaire horizontale, mais en assignant Android:layout_height="0dp" et Android:layout_weight="0" pour la disposition linéaire des boutons ne fonctionnait pas. Assigner Android:layout_height="wrap_content" pour la disposition linéaire des boutons uniquement. Voici ma mise en page de travail:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical" >

    <ListView
        Android:id="@+id/listView1"
        Android:layout_width="match_parent"
        Android:layout_height="0dp" 
        Android:layout_weight="1" />

    <LinearLayout 
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content" 
        Android:orientation="horizontal">

        <Button
            Android:id="@+id/new_button"
            Android:layout_width="0dp"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            Android:text="New" />

        <Button
            Android:id="@+id/suggest_button"
            Android:layout_width="0dp"
            Android:layout_height="wrap_content"
            Android:layout_weight="1"
            Android:text="Suggest" />

    </LinearLayout>

</LinearLayout>
4
William T. Mallard
  <?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="#ffffff"
  >

    <ListView Android:id="@+id/ListView01" 
      Android:layout_width="wrap_content" 
      Android:layout_height="wrap_content" 
      Android:layout_weight="1">
    </ListView>

    <FrameLayout Android:id="@+id/FrameLayout01" 
      Android:layout_width="fill_parent" 
      Android:layout_height="wrap_content">
         <Button Android:id="@+id/Button01" 
              Android:layout_width="wrap_content" 
              Android:layout_height="wrap_content" 
              Android:text="button" 
              Android:layout_gravity="center_horizontal">
        </Button>
    </FrameLayout>

  </LinearLayout>

Voici le design que vous recherchez. L'essayer.

4
Debarati

RelativeLayout ignorera ses enfants Android:layout_width ou Android:layout_height attributs, si les enfants ont des attributs qui définissent correctement leurs valeurs left et right ou top et bottom, respectivement.

Pour obtenir le résultat sur la bonne image, en affichant la liste au-dessus du bouton, votre mise en page doit ressembler à ceci:

<RelativeLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent">

    <Android.support.v7.widget.RecyclerView
        Android:id="@Android:id/list"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_above="@Android:id/button1"
        Android:layout_alignParentTop="true"/>

    <Button
        Android:id="@Android:id/button1"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:layout_alignParentBottom="true"
        Android:text="@Android:string/ok"/>

</RelativeLayout>

La clé est de définir Android:layout_alignParentTop (définit top valeur) et Android:layout_above (définit bottom valeur) dans votre RecyclerView. De cette façon, RelativeLayout ignorera Android:layout_height="match_parent", et le RecyclerView sera placé au-dessus du Button.

Aussi, assurez-vous de regarder dans Android:layout_alignWithParentIfMissing, si vous avez une mise en page plus complexe et que vous devez toujours définir ces valeurs.

2
jpmcosta

J'utilise Xamarin Android et mon besoin est identique à celui de William T. Mallard, ci-dessus, c'est-à-dire un ListView avec 2 boutons côte à côte situés en dessous. La solution est que cette réponse n'a pas fonctionné dans Xamarin Studio cependant - lorsque j'ai réglé la hauteur du ListView sur "0dp", le ListView a tout simplement disparu.

Mon code de travail Xamarin Android est le suivant:

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

<ListView
    Android:id="@+id/ListView1"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:layout_weight="1"
    Android:layout_above="@+id/ButtonsLinearLayout" />
<LinearLayout
    Android:id="@id/ButtonsLinearLayout"
    Android:layout_height="wrap_content"
    Android:layout_width="fill_parent"
    Android:orientation="horizontal"
    Android:layout_alignParentBottom="true">
    <Button
        Android:id="@+id/Button1"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_weight="1" />
    <Button
        Android:id="@+id/Button2"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:layout_weight="1" />
</LinearLayout>
</RelativeLayout>

J'ai aligné ButtonsLinearLayout au bas de l'écran et défini le ListView pour qu'il soit au-dessus de ButtonsLinearLayout.

1
S List

Dans votre mise en page relative de listview est match_parent _ qui est fill_parent (pour les versions 2.1 et antérieures), la meilleure solution consiste donc à utiliser la disposition relative, puis de déclarer d'abord le bouton puis la vue en liste, positionnez la vue de la liste comme ci-dessus, faire alignParentBottom .. Snippet est

<RelativeLayout 
Android:layout_width="fill_parent" Android:layout_height="fill_parent"
Android:id="@+id/rl1"><Button 
 Android:layout_width="MATCH_PARENT" 
 Android:layout_height="WRAP_CONTENT" 
 /><ListView 
 Android:layout_width="MATCH_PARENT" 
 Android:layout_height="0" 
 Android:layout_above="@id/listview"/></RelativeLayout>

Cela empêche votre vue liste de prendre toute la place et fait apparaître votre bouton.

0
om252345

@ jclova une dernière chose à faire est d'utiliser layout-below=@+id/listviewid en disposition relative

0
Girish