Hauteur limite de ListView sur Android
je veux montrer un bouton sous un ListView
. Le problème est, si le ListView
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 il n'y a pas de maxHeight pour une vue? ), mais soit j'ai mal pesé, soit ça n'a pas marché.
aussi, j'ai trouvé quelque part l'indication d'utiliser un RelativeLayout
. Le ListView
alors définies, au-dessus du bouton avec le android:layout_above
param.
le problème avec ceci est que je ne sais pas comment positionner le bouton après. Dans l'exemple que j'ai trouvé, la vue au-dessous du ListView
a été ajustée en utilisant 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 sethight et un certain calcul de l'espace requis?
Edit: j'ai eu beaucoup de réponses utiles.
-
la nation crie de bigstone et user639183 la solution presque a parfaitement fonctionné. Cependant, j'ai dû ajouter un rembourrage/marge supplémentaire au bas du bouton, car il serait encore poussé à mi-chemin de l'écran (mais puis arrêté)
-
la réponse D'Adinia avec la disposition relative seulement est très bien si vous voulez la bouton fixe à la partie inférieure de l'écran. Ce n'est pas ce que je voulais, mais ça pourrait être utile à d'autres.
-
la solution D'AngeloS était celle que j'ai choisie à la fin car elle vient de créer les effets que je voulais. Cependant, j'ai fait deux changements mineurs au
LinearLayout
autour du bouton:-
tout D'abord, comme je ne voulais pas avoir de valeurs absolues dans ma disposition , j'ai changé
android:layout_height="45px"
enwrap_content
, qui fonctionne très bien ainsi. -
Deuxièmement, comme je voulais que le bouton soit centré horizontalement, qui est seulement soutenu par vertical
LinearLayout
, j'ai changé android:orientation=" horizontal "à"vertical".
AngeloS a également déclaré dans son premier post qu'il n'était pas sûr si le
android:layout_weight="0.1"
param dans leLinearLayout
autour duListView
avait tout effet; je viens d'essayer et il fait réellement! Sans, le bouton est poussé hors de l'écran à nouveau. -
16 réponses
j'ai eu ce problème précis et pour le résoudre j'ai créé deux distincts LinearLayouts
pour loger les ListView
et Button
respectivement. De là, j'ai mis les deux dans un autre Linear Layout
et j'ai placé le conteneur android:orientation
à vertical
. J'ai également fixé le poids du LinearLayout
qui abritait le ListView
à 0.1
mais je ne sais pas si cela a un effet. De là, vous pouvez régler la hauteur du récipient inférieur (qui a votre bouton) à n'importe quelle hauteur vous tiens.
EDIT c'est ce que je veux dire:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.1"
>
<ListView android:id="@+id/ListView01"
android:layout_height="fill_parent"
android:layout_width="fill_parent"
android:dividerHeight="2px">
</ListView>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="45px"
android:background="@drawable/drawable"
>
<Button android:background="@drawable/btn_more2"
android:id="@+id/moreButton"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
la solution ci-dessus fixera le bouton le bas de l'écran.
pour faire flotter le bouton en bas de la liste, changer la hauteur de ListView01
en wrap_content
:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.1"
>
<ListView android:id="@+id/ListView01"
android:layout_height="wrap_content"
android:layout_width="fill_parent"
android:dividerHeight="2px">
</ListView>
</LinearLayout>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="45px"
android:background="@drawable/drawable"
>
<Button android:background="@drawable/btn_more2"
android:id="@+id/moreButton"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
j'ai résolu ce problème dans le code, la hauteur de réglage de listview seulement si elle a plus de 5 éléments en elle:
if(adapter.getCount() > 5){
View item = adapter.getView(0, null, listView);
item.measure(0, 0);
ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, (int) (5.5 * item.getMeasuredHeight()));
listView.setLayoutParams(params);
}
notez que j'ai réglé la hauteur maximale à 5,5 fois la hauteur d'un seul article, de sorte que l'utilisateur saura à coup sûr qu'il y a du défilement à faire! :)
sur votre dernière édition, vous avez juste à ajouter android:layout_above="@+id/butt1"
dans votre code ListView.
et pour vous montrer (et à tous ceux qui ont essayé de répondre plus tôt) que vous n'avez vraiment pas besoin d'utiliser plus d'un RelativeLayout
, voici votre code corrigé :
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/bkg">
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="TextView1"
android:layout_alignParentTop="true">
</TextView>
<TextView
android:id="@+id/textView2"
android:layout_below="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="TextView2"
android:layout_centerHorizontal="true">
</TextView>
<Button
android:id="@+id/butt1"
android:text="string/string3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true">
</Button>
<ListView
android:id="@+id/android:list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginTop="2dip"
android:layout_marginBottom="2dip"
android:drawSelectorOnTop="false"
android:visibility="visible"
android:layout_below="@+id/textView2"
android:layout_above="@+id/butt1" />
</RelativeLayout>
et le résultat , en utilisant une liste aléatoire:
en utilisant LinearLayout
, réglez la hauteur de votre ListView
et Button
à wrap_content
et ajoutez un poids=1 à ListView
. Cela devrait fonctionner comme vous le souhaitez.
Et oui, mettez le layout_gravity
du Button
à bottom
RelativeLayout
est une solution, si vous ne voulez pas que le bouton reste trop près du fond, vous pouvez ajouter des marges (le rembourrage d'un bouton le briserait parce qu'il utilise un 9-patch arrière-plan, et il met son propre rembourrage).
ce serait la même chose si vous utilisiez un LinearLayout
: la façon d'obtenir ce que vous voulez est de mettre le ListView
à une hauteur=0 et poids=1, et pour le bouton hauteur=wrap_content et Poids=0. (configuration de wrap_content, as user639183 dit, ne serait pas limiter "151920920 'S Hauteur).
a trouvé un moyen de le faire sans utiliser de récipients emboîtés, inspirés de la solution D'AngeloS.
j'ai utilisé un LinearLayout
avec une orientation verticale, qui a un ListView
et un bouton. J'ai mis le android:layout_weight="0.1"
pour le ListView
.
il réussit à obtenir le bâton de bouton au bas de la liste toujours. Et le bouton ne sort pas de l'écran lorsque la liste s'allonge.
<ListView
android:id="@+id/notes_list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="0.1"
/>
<Button
android:id="@+id/create_note_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="onCreateButtonClicked"
android:text="@string/create_notes"
/>
vous pouvez probablement faire ce travail en utilisant des conteneurs emboîtés. Il est possible que vous ayez besoin d'envelopper le bouton dans un deuxième conteneur (intérieur) de sorte qu'il prenne plus d'espace, et simplement aligner le bouton sur le dessus du conteneur intérieur.
Possible quelque chose comme ceci:
RelativeLayout
-- ListView
-- RelativeLayout
- - - - bouton
En utilisant les différentes options d'alignement sur les deux conteneurs, vous devriez être en mesure de faire fonctionner cela.
C'est la façon la plus propre de le faire:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ListView
android:id="@+id/ListView01"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:dividerHeight="2px">
</ListView>
<FrameLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/drawable"
>
<Button android:background="@drawable/btn_more2"
android:id="@+id/moreButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:paddingRight="20px"
/>
</LinearLayout>
</LinearLayout>
il est similaire à la solution D'Angelos, mais vous n'avez pas besoin de la sortie en ligne qui termine le ListView. Vous pouvez également utiliser un FrameLayout qui est plus léger comparer à un LinearLayout pour envelopper le Bouton.
l'idée est esquissée dans les très bonnes solutions par:
ils semblent tous deux fonctionner parfaitement au moins sur v4.4.3.
j'ai encore eu à passer un certain temps à écrire le code de test pour vérifier et confirmer chaque méthode. Vous trouverez ci-dessous le code de test minimal requis.
est basé sur la solution de Sparkle, car il contient moins de disposition imbriquée. Il a également été mis à jour pour tenir compte des vérifications actuelles des peluches.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
tools:context="MainActivity" >
<ListView
android:id="@+id/listview"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:layout_weight="1" />
<Button
android:id="@+id/btn"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Grow List"
tools:ignore="HardcodedText" />
</LinearLayout>
L'activité fournit le code pour tester la solution pour vous-même.
public class MainActivity extends Activity
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final ListView listview = (ListView)findViewById(R.id.listview);
final ArrayAdapter<String> adapter =
new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1,
new ArrayList<String>());
adapter.setNotifyOnChange(true);
listview.setAdapter(adapter);
findViewById(R.id.btn).setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
int count = adapter.getCount();
adapter.add(String.valueOf(count));
listview.setSelection(count);
}
});
}
}
N'hésitez pas à ajouter ou à améliorer car il s'agit du"wiki communautaire".
essayez D'utiliser RelativeLayout avec le bouton en bas. Réglez la hauteur de la mise en page comme "wrap_content". Je n'ai pas essayé. Juste à l'idée de
dans LinearLayout, il suffit d'ajouter android:layout_weight="1"
à votre ListView
ce qui suit est ce qui a fonctionné pour moi...
if(adapter.getCount() > 3){
View item = adapter.getView(0, null, impDateListView);
item.measure(0, 0);
LayoutParams params = impDateListView.getLayoutParams();
params.width = LayoutParams.MATCH_PARENT;
params.height = 3 * item.getMeasuredHeight();
impDateListView.setLayoutParams(params);
}
Remarque : Les paramètres.largeur.= .. Doit également être réglés...
l'exemple ci-dessus est lorsque vous utilisez TableRow et ListView à L'intérieur de TableRow...
wrap contenu dans les linéaires de la forme
dans la vue Liste Ajouter: android: layout_weight=" 1 "
dans votre jeu de boutons hauteur fixe
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<ListView
android:id="@+id/my_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="1">
</ListView>
<Button
android:text="Button"
android:layout_width="match_parent"
android:layout_height="50dp"/>
</LinearLayout>
si vous voulez que le contenu sous la vue liste soit déplacé vers le bas au fur et à mesure que des éléments sont ajoutés à la liste, essayez cette solution:
ajouter du rembourrage positif en bas de la liste et du rembourrage négatif en haut du "pied de page". Cela fonctionnera dans un plan linéaire ou un plan relatif.
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingBottom="50dp"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="-50dp"/>
Puisqu'il n'y a pas D'attribut MaxHeight, votre meilleure option est soit de définir la hauteur du ListView à une valeur définie, soit d'utiliser wrap_content
.
j'ai résolu ce problème en plaçant ListView dans un ScrollView. Lint n'a pas aimé, mais en ajoutant une minHeight et en mettant le fillViewport à true, j'ai un bon résultat.
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="1dp"
android:layout_marginRight="1dp"
android:minHeight="100dp"
android:fillViewport="true"
android:fadeScrollbars="false"
android:paddingTop="2dp"
android:orientation="vertical"
android:scrollbarAlwaysDrawVerticalTrack="true" >
<ListView
android:id="@+id/workoutAElistRoutines"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="fill_vertical"
android:background="@drawable/dialog_inner_border_tan"
android:choiceMode="singleChoice"
android:orientation="vertical"
android:paddingLeft="3dp"
android:paddingRight="3dp" >
</ListView>
</ScrollView>