Lineares Android-Layout - Wie halte ich das Element im unteren Bereich der Ansicht?

75

Ich habe eine, TextViewdie ich am Ende einer Landschaftsaktivität anheften möchte, die LinearLayoutmit vertikal angeordneten Elementen verwendet wird.

Ich habe android:gravity="bottom"die Textansicht festgelegt, aber sie befindet sich immer noch gerne direkt unter dem letzten Element des LinearLayoutgenauen Inhalts, den ich nicht möchte.

Irgendwelche Vorschläge?

Androider
quelle
Entfernen Sie einfach das android:gravity="bottom"von TextViewund fügen Sie es dem hinzu LinearLayout. Ihr Problem wird gelöst.
Stapelüberlauf

Antworten:

109

Update: Ich bekomme immer noch positive Stimmen zu dieser Frage, die immer noch die akzeptierte Antwort ist und die ich meiner Meinung nach schlecht beantwortet habe. Um sicherzustellen, dass die besten Informationen verfügbar sind, habe ich beschlossen, diese Antwort zu aktualisieren.

In modernem Android würde ConstraintLayoutich dies verwenden. Es ist performanter und unkomplizierter.

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

Wenn Sie kein ConstraintLayout verwenden möchten, ist die Verwendung eines LinearLayout mit erweiterter Ansicht eine einfache und hervorragende Möglichkeit, den zusätzlichen Speicherplatz in Anspruch zu nehmen (siehe die Antwort von @Matthew Wills). Wenn Sie den Hintergrund einer der Ansichten über der Unteransicht nicht erweitern möchten, können Sie eine unsichtbare Ansicht hinzufügen, um den Platz einzunehmen.

Die Antwort, die ich ursprünglich gegeben habe, funktioniert, ist aber ineffizient. Ineffizienz mag für ein einzelnes Layout der obersten Ebene keine große Sache sein, aber es wäre eine schreckliche Implementierung in einem ListViewoder RecyclerView, und es gibt einfach keinen Grund, dies zu tun, da es bessere Möglichkeiten gibt, die ungefähr auf derselben Ebene liegen von Aufwand und Komplexität, wenn nicht einfacher.

Nehmen Sie die Textansicht aus dem LinearLayout und fügen Sie das LinearLayout und die Textansicht in ein RelativeLayout ein. Fügen Sie das Attribut android:layout_alignParentBottom="true"der Textansicht hinzu. Mit allen Namespace- und anderen Attributen außer dem oben genannten Attribut entfernt:

<RelativeLayout>
  <LinearLayout>
    <!-- All your other elements in here -->
  </LinearLayout>
  <TextView
    android:layout_alignParentBottom="true" />
</RelativeLayout>
Brian Cooley
quelle
Dies hat das Problem behoben. Ich verwende eine bestimmte Höhe für Elemente innerhalb des linearen Layouts
Androider
1
Wenn Sie zu RelativeLayout wechseln, ist es möglicherweise besser, das LinearLayout vollständig zu entfernen und so unnötig verschachtelte Layouts zu vermeiden?
Erichamion
3
Für so etwas wie ein Layout, das 100 oder 1000 Mal für eine ListView aufgeblasen wurde, definitiv. Für ein einzelnes Layout für eine Aktivität ist es kein großer Erfolg. Sie tauschen den Komfort eines Programmierers gegen einen winzigen Leistungseinbruch aus.
Brian Cooley
1
Dies funktioniert nicht für Schaltflächen in einem LinearLayout.
IgorGanapolsky
119

Sie müssen eine Ihrer oberen Ansichten erweitern, um den verbleibenden Platz zu füllen, indem Sie sie festlegen android:layout_weight="1". Dadurch wird Ihre letzte Ansicht nach unten verschoben.

Hier ist eine kurze Skizze dessen, was ich meine:

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

wo jede der Kinderhöhen ist "wrap_content"und alles andere ist "fill_parent".

Matthew Willis
quelle
3
Sie müssen Breite und Höhe hinzufügen: <Ansicht android: layout_weight = "1" android: layout_height = "wrap_content" android: layout_width = "wrap_content" />
uvgroovy
1
Dies ist effizienter als die akzeptierte Antwort, da es nur eine ViewGroup gibt.
Dheeraj Vepakomma
2
Das ist großartig. Ich vergesse diesen Trick immer und verbringe am Ende ewig damit, an meinen Layouts herumzuspielen. Das ist einfach unglaublich. Löst den Welthunger.
Eric Cochran
1
Dies sollte die richtige Antwort sein! Nicht nur, weil nur ein LinearLayout verwendet wird, sondern wenn Sie DialogFragment mit dem erforderlichen Layoutdesign aufblasen (einige Ansichten sollten sich unten befinden), kann dies nützlich sein, da ich aus irgendeinem Grund android.view.InflateException erhalten habe: Binäre XML-Dateizeile # 7: ... bei Verwendung von RelativeLayout und bei Verwendung von LinearLayout funktioniert alles hervorragend.
Draško
1
@ Androider es wird angenommen, dass es die akzeptierte Antwort ist, die obere ist nur umgehen. Es funktioniert auch gut für Listenansichtselemente.
Farhan
58

Ich denke, es wird eine perfekte Lösung sein:

<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>
Sviatoslav Zaitsev
quelle
Es ist eine gute Lösung, funktioniert aber nur mit Level 14 API und höher.
Renatojf
@renatojf Sie können auch versuchen, leere Ansicht oder Layout anstelle von Raum zu verwenden
Sviatoslav Zaitsev
Vielen Dank! Dies ist genau das, was ich brauchte und ohne dass ich ein Layout verschachteln musste. Ich denke, Sie haben die überlegene Antwort.
Michael Alan Huff
2
Du bist ein genialer Mann !! Ich bin verschwenden 2 Tage für diese aber etwas vermissen es dank (nicht relativ verwenden und Komponente Ansicht Pager ich mein Layout so seine Schaffung Problem) - ich mehr als einen Punkt aber kann nicht geben wollen
sushant Gosavi
11

Sie sollten den Parameter Schwerkraft nicht in der Textansicht, sondern im linearen Layout nach unten setzen . So was:

<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>
Pau Arlandis Martinez
quelle
10

Schritt 1: Erstellen Sie zwei Ansichten in einem linearen Layout

Schritt 2: Die erste Ansicht muss auf Android gesetzt sein: layout_weight = "1"

Schritt 3: Die zweite Ansicht wird automatisch nach unten geputtet

<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>
Vinod Joshi
quelle
1

MÖGEN SIE DAS

 <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>
Syed Danish Haider
quelle
0

Sie können auch verwenden

android:layout_gravity="bottom"

für Ihre Textansicht

Pmap Technotech
quelle
-2

Versuche dies

<LinearLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textViewProfileName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView" />

</LinearLayout>
Pham Hong Phong
quelle