674 Stimmen

Wie kann ich die Ansichten am unteren Bildschirmrand ausrichten?

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>

Auf der linken Seite sehen Sie, wie es aussieht, und auf der rechten Seite, wie ich es haben möchte.

Android Layout - Actual (Left) and Desired (Right)

Die offensichtliche Antwort ist, die 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 bleibt.

Im Wesentlichen geht es darum, dass ich möchte, dass die Schaltfläche "Senden" und der Texteintrag eine feste Höhe am unteren Rand haben und die Textansicht den restlichen Platz ausfüllt. In ähnlicher Weise in der horizontalen linearen Layout möchte ich die Schaltfläche "Senden", um seinen Inhalt zu umbrechen und für den Texteintrag, um den Rest des Raumes zu füllen.

Wenn das erste Element in einem linearen Layout die Anweisung fill_parent erhält, tut es genau das und lässt keinen Platz für andere Elemente. Wie bringe ich ein Objekt, das das erste in einem linearen Layout ist, dazu, den gesamten Platz zu füllen, abgesehen von dem Minimum, das die übrigen Objekte im Layout benötigen?


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>

548voto

Janusz Punkte 181894

Die moderne Art, dies zu tun, besteht darin, eine ConstraintLayout und beschränken Sie den unteren Rand der Ansicht auf den unteren Rand des ConstraintLayouts mit app:layout_constraintBottom_toBottomOf="parent"

Das folgende Beispiel erstellt eine FloatingActionButton, die 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 beibehalten.

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


Wenn Sie ein relatives Layout haben, das den gesamten Bildschirm ausfüllt, sollten Sie in der Lage sein, die 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 vielleicht das Layout darüber den ganzen Platz ein. In diesem Fall können Sie die Ansicht, die unten sein soll, in Ihrer Layoutdatei an die erste Stelle setzen und den Rest des Layouts über den Ansichten mit android:layout_above . Auf diese Weise kann die untere Ansicht so viel Platz einnehmen, wie sie benötigt, und der Rest des Layouts kann den gesamten Rest des Bildschirms ausfüllen.

164voto

Bram Avontuur Punkte 1631

In einem ScrollView funktioniert dies nicht, da die RelativeLayout würde sich dann mit dem überschneiden, was sich in der ScrollView am Ende der Seite.

Ich habe das Problem mit einer dynamisch dehnbaren 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>

75voto

pseudosudo Punkte 1932

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>

46voto

Timores Punkte 14206

Die Antwort oben (von Janusz) ist ganz richtig, aber ich persönlich fühle mich nicht 100% bequem mit RelativeLayouts, so dass ich es vorziehen, einen "Füller", leere TextView, wie diese einzuführen:

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

vor dem Element, das sich am unteren Rand des Bildschirms befinden soll.

41voto

keybee Punkte 1478

Sie können dies auch mit einem LinearLayout oder einem ScrollView tun. Manchmal ist es einfacher zu implementieren als ein RelativeLayout. Das Einzige, was Sie tun müssen, ist, die folgende Ansicht hinzuzufügen antes de 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X