Voici mon code de mise en page;
<?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">
<TextView android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</TextView>
<LinearLayout android:id="@+id/LinearLayout"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="bottom">
<EditText android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
</EditText>
<Button android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
</LinearLayout>
</LinearLayout>
À quoi cela ressemble est à gauche et à quoi je veux ressembler est à droite.
La réponse évidente consiste à définir TextView sur fill_parent sur la hauteur, mais cela ne laisse aucune place au bouton ou au champ de saisie.
Essentiellement, le problème est que je veux que le bouton de soumission et l'entrée de texte soient à une hauteur fixe en bas et que la vue de texte remplisse le reste de l'espace. De même, dans la disposition linéaire horizontale, je veux que le bouton Soumettre enveloppe son contenu et que l'entrée de texte remplisse le reste de l'espace.
Si le premier élément d'une disposition linéaire est dit à fill_parent, il fait exactement cela, ne laissant aucune place aux autres éléments. Comment puis-je obtenir un élément qui est le premier dans une mise en page linéaire pour remplir tout l'espace en dehors du minimum requis par le reste des éléments de la mise en page?
Les dispositions relatives étaient en effet la réponse:
<?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">
<TextView
android:text="@string/welcome"
android:id="@+id/TextView"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true">
</TextView>
<RelativeLayout
android:id="@+id/InnerRelativeLayout"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true" >
<Button
android:text="@string/label_submit_button"
android:id="@+id/Button"
android:layout_alignParentRight="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</Button>
<EditText
android:id="@+id/EditText"
android:layout_width="fill_parent"
android:layout_toLeftOf="@id/Button"
android:layout_height="wrap_content">
</EditText>
</RelativeLayout>
</RelativeLayout>
Réponses:
La manière moderne de procéder consiste à avoir un ConstraintLayout et à contraindre le bas de la vue au bas du ConstraintLayout avec
app:layout_constraintBottom_toBottomOf="parent"
L'exemple ci-dessous crée un FloatingActionButton qui sera aligné à la fin et au bas de l'écran.
Pour référence, je garderai mon ancienne réponse.
Avant l'introduction de ConstraintLayout, la réponse était une disposition relative .
Si vous avez une disposition relative qui remplit tout l'écran, vous devriez pouvoir utiliser
android:layout_alignParentBottom
pour déplacer le bouton en bas de l'écran.Si vos vues en bas ne sont pas affichées dans une disposition relative, alors la disposition ci-dessus peut prendre tout l'espace. Dans ce cas, vous pouvez placer la vue, qui devrait être en bas, d'abord dans votre fichier de mise en page et positionner le reste de la mise en page au-dessus des vues avec
android:layout_above
. Cela permet à la vue de dessous de prendre autant d'espace qu'elle en a besoin et le reste de la mise en page peut remplir tout le reste de l'écran.la source
android:layout_above
?that RelativeLayout
consomme beaucoup de mémoire et doit être évité autant que possible.Dans un
ScrollView
cela ne fonctionne pas, car leRelativeLayout
chevaucherait alors tout ce qui se trouve enScrollView
bas de la page.Je l'ai corrigé en utilisant un étirement dynamique
FrameLayout
:la source
Vous pouvez conserver votre disposition linéaire initiale en imbriquant la disposition relative dans la disposition linéaire:
la source
La réponse ci-dessus (par Janusz) est tout à fait correcte, mais personnellement je ne me sens pas à 100% à l'aise avec RelativeLayouts, donc je préfère introduire un 'filler', TextView vide, comme ceci:
devant l'élément qui devrait être en bas de l'écran.
la source
Vous pouvez également le faire avec un LinearLayout ou un ScrollView. Parfois, il est plus facile à implémenter qu'un RelativeLayout. La seule chose que vous devez faire est d'ajouter la vue suivante avant les vues que vous souhaitez aligner en bas de l'écran:
Cela crée une vue vide, remplissant l'espace vide et poussant les vues suivantes vers le bas de l'écran.
la source
Cela fonctionne également.
la source
1. Utilisez
ConstraintLayout
dans votre disposition racineEt paramétrez
app:layout_constraintBottom_toBottomOf="parent"
pour laisser la mise en page en bas de l'écran:2. Utilisation
FrameLayout
dans votre disposition racineDéfinissez simplement
android:layout_gravity="bottom"
votre mise en page3. Utilisez
LinearLayout
dans votre disposition racine (android:orientation="vertical"
)(1) Définissez une mise
android:layout_weight="1"
en page en haut de votre mise en page(2) Réglez l'enfant
LinearLayout
pourandroid:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"
L'attribut principal est
ndroid:gravity="bottom"
, laissez la vue enfant au bas de la mise en page.4. Utilisation
RelativeLayout
dans la disposition racineEt réglé
android:layout_alignParentBottom="true"
pour laisser la mise en page en bas de l'écranProduction
la source
Faisant suite à la solution élégante Timores , j'ai constaté que ce qui suit crée un remplissage vertical dans un LinearLayout vertical et un remplissage horizontal dans un LinearLayout horizontal:
la source
Vous n'avez même pas besoin d'imbriquer la deuxième
relative
disposition à l'intérieur de la première. Utilisez simplement leandroid:layout_alignParentBottom="true"
dans le bouton et EditText .la source
Si vous ne souhaitez pas apporter de nombreuses modifications, vous pouvez simplement mettre:
pour le TextView ayant l'ID comme
@+id/TextView
iela source
En créant à la fois l'en- tête et le pied de page , voici un exemple:
Disposition XML
Capture d'écran
la source
Utilisez le code ci-dessous. Alignez le bouton sur le bouton. Ça marche.
la source
Pour un cas comme celui-ci, utilisez toujours RelativeLayouts. Un LinearLayout n'est pas destiné à une telle utilisation.
la source
Utilisez
android:layout_alignParentBottom="true"
dans votre<RelativeLayout>
.Cela vous aidera certainement.
la source
Si vous avez une hiérarchie comme celle-ci:
Tout d'abord, appliquez-vous
android:fillViewport="true"
àScrollView
puis appliquez-vousandroid:layout_alignParentBottom="true"
àLinearLayout
.Cela a parfaitement fonctionné pour moi.
la source
Vous pouvez simplement donner à votre vue enfant supérieure (TextView @ + id / TextView ) un attribut:
android:layout_weight="1"
.Cela forcera tous les autres éléments en dessous vers le bas.
la source
Cela peut également être fait avec une disposition linéaire.
Indiquez simplement Height = 0dp et weight = 1 à la disposition ci-dessus et à celle que vous souhaitez en bas. Écrivez simplement hauteur = contenu enveloppé et sans poids.
Il fournit un contenu d'habillage pour la mise en page (celui qui contient votre texte et bouton d'édition), puis celui qui a du poids occupe le reste de la mise en page.
Je l'ai découvert par accident.
la source
J'ai utilisé la solution publiée par Janusz, mais j'ai ajouté un remplissage à la dernière vue, car la partie supérieure de ma mise en page était un ScrollView.
Le ScrollView sera partiellement masqué à mesure qu'il grandit avec le contenu. L'utilisation
android:paddingBottom
de la dernière vue permet d'afficher tout le contenu du ScrollView.la source