web-dev-qa-db-fra.com

Android Linear Layout - Comment garder l'élément au bas de la vue?

J'ai une TextView que je veux épingler au bas d'une activité de paysage qui utilise LinearLayout avec des éléments disposés verticalement. 

J'ai mis Android:gravity="bottom" dans la vue texte, mais il aime toujours être juste en dessous du dernier élément de la LinearLayout exactement ce que je ne veux pas que ce soit fait. 

Aucune suggestion?

67
Androider

Mise à jour: Je reçois toujours des votes sur cette question, qui est toujours la réponse acceptée et à laquelle je pense avoir mal répondu. Afin de s'assurer que les meilleures informations sont disponibles, j'ai décidé de mettre à jour cette réponse.

Dans Android moderne, je voudrais utiliser ConstraintLayout pour le faire. Il est plus performant et simple.

<ConstraintLayout>
   <View
      Android:id="@+id/view1"
      ...other attributes elided... />
   <View
      Android:id="@id/view2"        
      app:layout_constraintTop_toBottomOf="@id/view1" />
      ...other attributes elided... />

   ...etc for other views that should be aligned top to bottom...

   <TextView
    app:layout_constraintBottom_toBottomOf="parent" />

Si vous ne souhaitez pas utiliser un objet ConstraintLayout, utiliser un objet LinearLayout avec une vue agrandie est un moyen simple et efficace de prendre de la place (voir la réponse de @Matthew Wills). Si vous ne souhaitez pas développer l'arrière-plan d'une des vues au-dessus de la vue du bas, vous pouvez ajouter une vue invisible pour occuper l'espace.

La réponse que j'ai donnée à l'origine fonctionne mais est inefficace. L’inefficacité n’est peut-être pas un problème pour une seule disposition de niveau supérieur, mais il s'agirait d’une implémentation terrible dans une variable ListView ou RecyclerView même niveau d'effort et de complexité sinon plus simple.

Sortez TextView de LinearLayout, puis placez LinearLayout et TextView dans un RelativeLayout. Ajoutez l'attribut Android:layout_alignParentBottom="true" au TextView. Avec tous les espaces de noms et autres attributs, à l'exception de l'attribut ci-dessus, élidé:

<RelativeLayout>
  <LinearLayout>
    <!-- All your other elements in here -->
  </LinearLayout>
  <TextView
    Android:layout_alignParentBottom="true" />
</RelativeLayout>
99
Brian Cooley

Vous devrez développer l'une de vos vues supérieures pour remplir l'espace restant en y définissant Android:layout_weight="1". Cela poussera votre dernière vue vers le bas.

Voici un bref aperçu de ce que je veux dire:

<LinearLayout Android:orientation="vertical">
    <View/>
    <View Android:layout_weight="1"/>
    <View/>
    <View Android:id="@+id/bottom"/>
</LinearLayout>

où chaque hauteur de vue enfant est "wrap_content" et tout le reste est "fill_parent".

105
Matthew Willis

Je pense que ce sera la solution parfaite:

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

    <!-- Other views -->
    <Space
        Android:layout_width="match_parent"
        Android:layout_height="0dp"
        Android:layout_weight="1"/>

    <!-- Target view below -->
    <View
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

</LinearLayout>
49

Vous devez placer le paramètre gravity en bas pas dans la vue texte mais dans la présentation linéaire . Comme ça:

<LinearLayout
    xmlns:Android="http://schemas.Android.com/apk/res/Android"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:orientation="vertical"
    Android:gravity="bottom|end">
    <TextView
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:text="Something"/>
</LinearLayout>
9

Étape 1: Créer deux vues à l'intérieur d'une mise en page linéaire

Étape 2: La première vue doit être définie sur Android: layout_weight = "1"

Étape 3: La seconde vue sera automatiquement mise à la baisse

<LinearLayout
Android:id="@+id/botton_header"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:orientation="vertical" >

    <View
    Android:layout_width="match_parent"
    Android:layout_height="0dp"
    Android:layout_weight="1" />

    <Button
    Android:id="@+id/btn_health_advice"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"/>


</LinearLayout>
5
Vinod Joshi

FAIT COMME ÇA

 <LinearLayout
Android:id="@+id/LinearLayouts02"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical"
Android:gravity="bottom|end">

<TextView
    Android:id="@+id/texts1"
    Android:layout_height="match_parent"
    Android:layout_width="match_parent"
    Android:layout_weight="2"
    Android:text="@string/forgotpass"
    Android:padding="7dp"
    Android:gravity="bottom|center_horizontal"
    Android:paddingLeft="10dp"
    Android:layout_marginBottom="30dp"
    Android:bottomLeftRadius="10dp"
    Android:bottomRightRadius="50dp"
    Android:fontFamily="sans-serif-condensed"
    Android:textColor="@color/colorAccent"
    Android:textStyle="bold"
    Android:textSize="16sp"
    Android:topLeftRadius="10dp"
    Android:topRightRadius="10dp"
   />

</LinearLayout>
0
Syed Danish Haider

Vous pouvez aussi utiliser 

Android:layout_gravity="bottom"

pour votre textview

0
Pmap Technotech