Je veux afficher un bouton sous un ListView
. Le problème est que si le ListView
fichier est étendu (éléments ajoutés ...), le bouton est poussé hors de l'écran.
J'ai essayé un LinearLayout
avec des poids (comme suggéré dans Android: pourquoi n'y a-t-il pas de maxHeight pour une vue? ), Mais soit je me suis trompé de poids, soit cela n'a tout simplement pas fonctionné.
Aussi, j'ai trouvé quelque part le conseil d'utiliser un fichier RelativeLayout
. Le ListView
serait alors placé au-dessus du bouton avec le android:layout_above
paramètre.
Le problème avec ceci est que je ne sais pas comment positionner le bouton par la suite. Dans l'exemple que j'ai trouvé, la vue ci-dessous a ListView
été ajustée à l'aide de android:layout_alignParentBottom
, mais je ne veux pas que mon bouton s'accroche au bas de l'écran.
Des idées en dehors de l'utilisation de la méthode setHeight et du calcul de l'espace requis?
Edit: j'ai beaucoup de réponses utiles.
La solution de bigstone & user639183 a presque parfaitement fonctionné. Cependant, j'ai dû ajouter un rembourrage / une marge supplémentaire au bas du bouton, car il serait toujours poussé à mi-chemin de l'écran (mais ensuite arrêté)
La réponse d'Adinia avec la disposition relative ne convient que si vous voulez que le bouton soit fixé au bas de l'écran. Ce n'est pas ce que je voulais mais cela pourrait quand même être utile pour les autres.
La solution d'AngeloS a été celle que j'ai choisie à la fin car elle ne faisait que créer les effets que je voulais. Cependant, j'ai apporté deux modifications mineures au
LinearLayout
contour du bouton:Tout d'abord, comme je ne voulais pas avoir de valeurs absolues dans ma mise en page, je suis passé
android:layout_height="45px"
àwrap_content
, ce qui fonctionne très bien aussi.Deuxièmement, comme je voulais que le bouton soit centré horizontalement, ce qui n'est supporté que par vertical
LinearLayout
, j'ai changé android: orientation = "horizontal" en "vertical".
AngeloS a également déclaré dans son message initial qu'il n'était pas sûr que le
android:layout_weight="0.1"
paramètreLinearLayout
autour de l 'ListView
ait eu un effet; J'ai juste essayé et c'est le cas! Sans, le bouton est à nouveau poussé hors de l'écran.
la source
android:layout_alignParentBottom="true"
. Mais pour être clair, voulez-vous que le bouton reste attaché au bas de la ListView lorsqu'il y a peu d'éléments? Si oui, voyez ce que dit Rich.Réponses:
J'ai eu ce problème exact et pour le résoudre, j'ai créé deux séparés
LinearLayouts
pour héberger leListView
etButton
respectivement. De là, j'ai mis les deux dans un autreLinear Layout
et mis ce conteneurandroid:orientation
àvertical
. J'ai également défini le poids duLinearLayout
qui abritait leListView
to0.1
mais je ne sais pas si cela a un effet. À partir de là, vous pouvez définir la hauteur du conteneur inférieur (qui a votre bouton) à la hauteur que vous souhaitez.EDIT c'est ce que je veux dire:
La solution ci-dessus fixera le bouton en bas de l'écran.
Pour que le bouton flotte en bas de la liste, changez la hauteur de
ListView01
enwrap_content
:la source
<div
balises HTML ... c'est juste un wrapper et cette solution fonctionne définitivement.J'ai résolu ce problème dans le code, en définissant la hauteur de la liste uniquement si elle contient plus de 5 éléments:
Notez que j'ai défini la hauteur maximale à 5,5 fois la hauteur d'un seul élément, de sorte que l'utilisateur saura avec certitude qu'il y a du défilement à faire! :)
la source
Lors de votre dernière modification, il vous suffit d'ajouter également
android:layout_above="@+id/butt1"
votre code ListView.Et pour vous montrer (ainsi qu'à tous ceux qui ont essayé une réponse plus tôt) que vous n'avez vraiment pas besoin d'en utiliser plus d'une
RelativeLayout
, voici votre code corrigé :et le résultat , en utilisant une liste aléatoire:
la source
À l'aide de
LinearLayout
, définissez la hauteur de votreListView
etButton
àwrap_content
et ajoutez un poids = 1 àListView
. Cela devrait fonctionner comme vous le souhaitez.Et oui, réglez
layout_gravity
leButton
surbottom
la source
Nous avons trouvé un moyen de le faire sans utiliser de conteneurs imbriqués, inspirés de la solution AngeloS.
J'ai utilisé un
LinearLayout
avec une orientation verticale, qui a unListView
et un bouton. J'ai mis leandroid:layout_weight="0.1"
pour leListView
.Il parvient à toujours placer le bouton en bas de la liste. Et le bouton n'est pas poussé hors de l'écran lorsque la liste s'allonge.
la source
android:layout_height="wrap_content"
pour le LinearLayout, comme dans votre solution, cela fonctionne parfaitement, et pas seulement sur 4.4.3, mais comme Sparkle ne l'a pas mentionné, je l'ai essayé avecmatch_parent
avant.RelativeLayout
est une solution, si vous ne voulez pas que le bouton reste trop près du bas, vous pouvez ajouter des marges (le remplissage d'un bouton le casserait car il utilise un arrière-plan à 9 patchs et définit son propre remplissage).Ce serait la même chose si vous utilisiez a
LinearLayout
: la façon d'obtenir ce que vous voulez est de définir leListView
sur une hauteur = 0 et un poids = 1, et pour le bouton height = wrap_content et weight = 0.(définir les deux sur wrap_content, comme l'a dit user639183, ne limiterait pasListView
la hauteur de).la source
ListView
hauteur duVous pouvez probablement faire cela en utilisant des conteneurs imbriqués. Il est possible que vous deviez envelopper le Button dans un deuxième conteneur (interne) afin qu'il prenne plus d'espace, et alignez simplement le Button sur le haut du conteneur interne.
Quelque chose comme ça possible:
Disposition relative
- ListView
-- Disposition relative
---- Bouton
En utilisant les différentes options d'alignement sur les deux conteneurs, vous devriez être en mesure de faire fonctionner cela.
la source
android:layout_marginTop="30dip"
pour le bouton, si vous voulez plus d'espace entre la liste et le bouton, par exemple.C'est la façon la plus propre de le faire:
C'est similaire à la solution d'Angelos mais vous n'avez pas besoin de la disposition linéaire qui encapsule la ListView. Vous pouvez également utiliser un FrameLayout qui est plus léger qu'un LinearLayout pour boucler le Button.
la source
L'idée est esquissée dans les très bonnes solutions par:
Ils semblent tous les deux fonctionner parfaitement au moins sur la v4.4.3.
Je devais encore passer du temps à écrire le code de test pour le vérifier et confirmer chaque méthode. Vous trouverez ci-dessous le code de test minimal et autonome requis.
La mise en page est basée sur la solution de Sparkle, car elle contient moins de mise en page imbriquée. A également été mis à jour pour refléter les contrôles LINT actuels.
L'activité fournit le code standard pour tester la solution par vous-même.
N'hésitez pas à ajouter ou à améliorer car il s'agit d'un "wiki communautaire".
la source
Essayez d'utiliser RelativeLayout avec le bouton en bas. Définissez la hauteur de la mise en page sur "wrap_content". Je n'ai pas essayé. Juste une idée
la source
dans LinearLayout, ajoutez simplement
android:layout_weight="1"
à votre ListViewla source
Voici ce qui a fonctionné pour moi ...
Remarque: Le paramètre params.width = ... doit également être défini ...
L'exemple ci-dessus est lorsque vous utilisez TableRow et ListView dans TableRow ...
la source
envelopper le contenu dans une mise en page linéaire
dans la vue Liste, ajoutez: android: layout_weight = "1"
dans votre jeu de boutons hauteur fixe
la source
Si vous souhaitez que le contenu sous la vue de liste se déplace vers le bas à mesure que des éléments sont ajoutés à la liste, essayez cette solution:
Ajoutez un remplissage positif en bas de la vue de liste et un remplissage négatif en haut du "pied de page". Cela fonctionnera dans une disposition linéaire ou une disposition relative.
la source
Puisqu'il n'y a pas d'attribut MaxHeight, votre meilleur pari est de définir la hauteur de ListView sur une valeur définie, ou d'utiliser
wrap_content
.la source
J'ai résolu ce problème en plaçant le ListView dans un ScrollView. Lint n'a pas aimé, mais en ajoutant un minHeight et en définissant le fillViewport sur true, j'ai un bon résultat.
la source