Wie richte ich Ansichten am unteren Rand des Bildschirms aus?

Lesezeit: 10 Minuten

Wie richte ich Ansichten am unteren Rand des Bildschirms aus
gav

Hier ist mein Layout-Code;

<?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>

Wie das aussieht, steht links und wie es aussehen soll, steht rechts.

Android-Layout – Ist (links) und Gewünscht (rechts)

Die offensichtliche Antwort ist, TextView auf fill_parent on height zu setzen, aber das führt dazu, dass kein Platz mehr für die Schaltfläche oder das Eingabefeld übrig bleibt.

Im Wesentlichen besteht das Problem darin, dass ich möchte, dass die Schaltfläche „Senden“ und der Texteintrag unten eine feste Höhe haben und die Textansicht den Rest des Raums ausfüllt. In ähnlicher Weise möchte ich im horizontalen linearen Layout, dass die Schaltfläche „Senden“ ihren Inhalt umschließt und der Texteintrag den Rest des Raums ausfüllt.

Wenn das erste Element in einem linearen Layout fill_parent mitgeteilt wird, tut es genau das und lässt keinen Platz für andere Elemente. Wie bekomme ich ein Element, das sich zuerst in einem linearen Layout befindet, um den gesamten Platz auszufüllen, abgesehen von dem Minimum, das für die restlichen Elemente im Layout erforderlich ist?


Relative Layouts waren tatsächlich die Antwort:

    <?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>

  • @oneself Paint 😉 Ich verwende einen Skin auf dem Emulator, allerdings mit freundlicher Genehmigung von Tea Vui Huang teavuihuang.com/android

    – gav

    24. April 2011 um 10:20 Uhr

  • +1 für das Posten des Layout-XML, das es gelöst hat. Hat mir geholfen herauszufinden, was mit mir nicht stimmt.

    – Heuler

    29. Februar 2012 um 19:23 Uhr

1646260988 192 Wie richte ich Ansichten am unteren Rand des Bildschirms aus
Janusz

Der moderne Weg, dies zu tun, besteht darin, a zu haben ConstraintLayout und beschränken Sie den unteren Rand der Ansicht auf den unteren Rand des ConstraintLayout mit app:layout_constraintBottom_toBottomOf="parent"

Das folgende Beispiel erstellt einen FloatingActionButton, der am Ende und am unteren Rand des Bildschirms ausgerichtet wird.

<android.support.constraint.ConstraintLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_height="match_parent"
   android:layout_width="match_parent">

<android.support.design.widget.FloatingActionButton
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"

    app:layout_constraintBottom_toBottomOf="parent"

    app:layout_constraintEnd_toEndOf="parent" />

</android.support.constraint.ConstraintLayout>

Als Referenz werde ich meine alte Antwort behalten.

Vor der Einführung von ConstraintLayout war die Antwort a relative Anordnung.


Wenn Sie ein relatives Layout haben, das den gesamten Bildschirm ausfüllt, sollten Sie es verwenden können android:layout_alignParentBottom um die Schaltfläche an den unteren Rand des Bildschirms zu verschieben.

Wenn Ihre Ansichten unten nicht in einem relativen Layout angezeigt werden, nimmt das Layout darüber möglicherweise den gesamten Platz ein. In diesem Fall können Sie die Ansicht, die ganz unten sein soll, zuerst in Ihre Layoutdatei legen und den Rest des Layouts mit über den Ansichten positionieren android:layout_above. Dadurch nimmt die Ansicht von unten so viel Platz ein, wie sie benötigt, und der Rest des Layouts kann den gesamten Bildschirm ausfüllen.

  • FYI: Das würde in einem ScrollView nicht funktionieren. Das ist das Problem, mit dem ich jetzt konfrontiert bin. Siehe stackoverflow.com/questions/3126347/…

    – IgorGanapolsky

    23. Mai 2012 um 0:40 Uhr

  • Das ist richtig, ScrollViews und Relative Layouts passen nicht sehr gut zusammen. Wenn Sie zu viel Inhalt haben, um alles auf einer Seite anzuzeigen, verwenden Sie einfach ein lineares Layout und fügen Sie die Ansicht von unten zuletzt ein. Wenn Sie möchten, dass die Ansicht auf kleinen Bildschirmen zuletzt in der Bildlaufansicht und auf größeren Telefonen unten auf der Seite angezeigt wird, sollten Sie die Verwendung unterschiedlicher Layoutdateien in Betracht ziehen und Ressourcenqualifizierer verwenden, damit das Gerät die richtige Layoutdatei auswählen kann.

    – Janusz

    23. Mai 2012 um 7:46 Uhr


  • ok .. was soll der zweite Absatz der Antwort hier? “Sie sollten zuerst ein Layout finden, das den unteren Bildschirmrand abdeckt”? dann sollten wir layout_alignParentBottom innerhalb des Layouts verwenden? Was brauchen wir android:layout_above zum?

    – Eugen

    7. Juli 2013 um 12:52 Uhr

  • Sie brauchen das Obige, wenn Sie so etwas wie eine Leiste unten und dann ein LinearLayout über dieser Leiste haben möchten, das sich vom oberen Bildschirmrand bis zur Leiste erstreckt.

    – Janusz

    18. Oktober 2014 um 10:45 Uhr

  • Ich habe in einem von “Android Weekly” gelesen that RelativeLayout ist speicherintensiv und sollte nach Möglichkeit vermieden werden.

    – Tomasz Mularczyk

    27. Juni 2015 um 19:11 Uhr

1646260988 722 Wie richte ich Ansichten am unteren Rand des Bildschirms aus
Bram Avontuur

In einem ScrollView das geht nicht, da die RelativeLayout würde sich dann überschneiden, was auch immer in der ist ScrollView am Ende der Seite.

Ich habe es mit einem dynamischen Stretching behoben FrameLayout :

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_height="match_parent" 
    android:layout_width="match_parent"
    android:fillViewport="true">
    <LinearLayout 
        android:id="@+id/LinearLayout01"
        android:layout_width="match_parent" 
        android:layout_height="match_parent"
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical">

                <!-- content goes here -->

                <!-- stretching frame layout, using layout_weight -->
        <FrameLayout
            android:layout_width="match_parent" 
            android:layout_height="0dp"
            android:layout_weight="1">
        </FrameLayout>

                <!-- content fixated to the bottom of the screen -->
        <LinearLayout 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"
            android:orientation="horizontal">
                                   <!-- your bottom content -->
        </LinearLayout>
    </LinearLayout>
</ScrollView>

  • das ist großartig – außerdem ist es “minimal invasiv” und intuitiver als der RelativeLayout-Ansatz. Ich würde mehr als eine positive Stimme geben, wenn ich könnte!

    – menschlich

    30. August 2011 um 12:31 Uhr

  • Ich verwende Ihre Lösung in meiner Anwendung, aber in meinem Fall möchte ich, dass die Schaltflächen am unteren Rand des Bildschirms (hinter der Tastatur) bleiben, wenn die Tastatur angezeigt wird. Gibt es eine Lösung dafür? Danke.

    – Yoann

    19. Januar 2012 um 16:02 Uhr

  • @DoubleYo: im Manifest android:windowSoftInputMode=”adjustPan”

    – nsp

    13. Juli 2012 um 12:56 Uhr

  • Wenn Sie möchten, dass der Boden dauerhaft befestigt wird, sodass er ständig angezeigt wird, funktioniert dies nicht. Ansonsten funktioniert es.

    – basiskarl

    2. November 2012 um 17:06 Uhr

1646260989 923 Wie richte ich Ansichten am unteren Rand des Bildschirms aus
pseudosudo

Sie können Ihr ursprüngliches lineares Layout beibehalten, indem Sie das relative Layout innerhalb des linearen Layouts verschachteln:

<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

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

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <Button android:text="submit" 
            android:id="@+id/Button" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true">
        </Button>
        <EditText android:id="@+id/EditText" 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@id/Button"
            android:layout_alignParentBottom="true">
        </EditText>
    </RelativeLayout>
</LinearLayout>

  • Dies ist ein chaotischer Ansatz, da er nicht sehr modular ist. Sie sollten keine überlappenden Layouts haben. Dieses Design funktioniert nicht, sobald Sie den Hintergrund des RelativeLayout ändern oder eine der Ansichten vergrößern oder Ansichten hinzufügen möchten.

    – Patrick

    18. Juni 2015 um 1:21 Uhr

Die obige Antwort (von Janusz) ist ganz richtig, aber ich persönlich fühle mich mit RelativeLayouts nicht 100% wohl, daher ziehe ich es vor, eine “füllende”, leere TextView einzuführen, wie diese:

<!-- filler -->
<TextView android:layout_height="0dip" 
          android:layout_width="fill_parent"
          android:layout_weight="1" />

vor dem Element, das sich am unteren Bildschirmrand befinden sollte.

1646260989 785 Wie richte ich Ansichten am unteren Rand des Bildschirms aus
Schlüsselbiene

Sie können dies auch mit einem LinearLayout oder einem ScrollView tun. Manchmal ist es einfacher zu implementieren als ein RelativeLayout. Sie müssen lediglich die folgende Ansicht hinzufügen Vor die Ansichten, die Sie am unteren Rand des Bildschirms ausrichten möchten:

<View
    android:layout_width="wrap_content"
    android:layout_height="0dp"
    android:layout_weight="1" />

Dadurch wird eine leere Ansicht erstellt, die den leeren Raum füllt und die nächsten Ansichten an den unteren Rand des Bildschirms verschiebt.

  • Dieses Konzept ähnelt dem Füller, wie @Timores zuvor sagte.

    – Gumuruh

    1. März 2021 um 8:07 Uhr

  • Das ist es, wonach ich seit Stunden suche. Danke!

    – ng-Benutzer

    22. Juli 2021 um 18:30 Uhr

Wie richte ich Ansichten am unteren Rand des Bildschirms aus
Michael Schied

Das funktioniert auch.

<LinearLayout 
    android:id="@+id/linearLayout4"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:layout_below="@+id/linearLayout3"
    android:layout_centerHorizontal="true"
    android:orientation="horizontal" 
    android:gravity="bottom"
    android:layout_alignParentBottom="true"
    android:layout_marginTop="20dp"
>

    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" 

    />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" 


    />

</LinearLayout>

gravity="bottom", um LinearLayout-Elemente nach unten schweben zu lassen

  • Dieses Konzept ähnelt dem Füller, wie @Timores zuvor sagte.

    – Gumuruh

    1. März 2021 um 8:07 Uhr

  • Das ist es, wonach ich seit Stunden suche. Danke!

    – ng-Benutzer

    22. Juli 2021 um 18:30 Uhr

1646260990 251 Wie richte ich Ansichten am unteren Rand des Bildschirms aus
Peter Mortensen

1. Verwenden ConstraintLayout in Ihrem Root-Layout

Und eingestellt app:layout_constraintBottom_toBottomOf="parent" um das Layout am unteren Rand des Bildschirms anzuzeigen:

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    app:layout_constraintBottom_toBottomOf="parent">
</LinearLayout>

2. Verwenden FrameLayout in Ihrem Root-Layout

Einfach einstellen android:layout_gravity="bottom" in deiner Anordnung

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="bottom"
    android:orientation="horizontal">
</LinearLayout>

3. Verwenden LinearLayout in Ihrem Root-Layout (android:orientation="vertical")

(1) Legen Sie ein Layout fest android:layout_weight="1" oben in Ihrem Layout

<TextView
    android:id="@+id/TextView"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    android:text="welcome" />

(2) Stellen Sie das Kind ein LinearLayout zum android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"

Das Hauptattribut ist ndroid:gravity="bottom"lassen Sie das Kind unten im Layout anzeigen.

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="bottom"
    android:orientation="horizontal">
</LinearLayout>

4. Verwenden RelativeLayout im Root-Layout

Und eingestellt android:layout_alignParentBottom="true" um das Layout am unteren Rand des Bildschirms zu lassen

<LinearLayout
    android:id="@+id/LinearLayout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignParentBottom="true"
    android:orientation="horizontal">
</LinearLayout>

Ausgabe

Geben Sie hier die Bildbeschreibung ein

916900cookie-checkWie richte ich Ansichten am unteren Rand des Bildschirms aus?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy