Hier ist mein Layoutcode;
<?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, ist links und wie es aussehen soll, ist rechts.
Die offensichtliche Antwort besteht darin, die Textansicht in der Höhe auf fill_parent zu setzen. Dadurch bleibt jedoch kein Platz mehr für die Schaltfläche oder das Eingabefeld.
Im Wesentlichen besteht das Problem darin, dass die Schaltfläche "Senden" und die Texteingabe unten eine feste Höhe haben sollen und die Textansicht den Rest des Bereichs ausfüllt. In ähnlicher Weise möchte ich, dass im horizontalen linearen Layout die Schaltfläche "Senden" den Inhalt umschließt und die Texteingabe den Rest des Bereichs ausfüllt.
Wenn das erste Element in einem linearen Layout aufgefordert wird, fill_parent auszuführen, wird genau das ausgeführt, sodass kein Platz für andere Elemente bleibt. Wie erhalte ich ein Element, das sich zuerst in einem linearen Layout befindet, um den gesamten Raum bis auf das Minimum auszufüllen, das für die übrigen Elemente im Layout erforderlich ist?
Relative Layouts waren in der Tat 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>
Antworten:
Der moderne Weg, dies zu tun, besteht darin, ein ConstraintLayout zu haben und den unteren Rand der Ansicht auf den unteren Rand des ConstraintLayout mit zu beschränken
app:layout_constraintBottom_toBottomOf="parent"
Im folgenden Beispiel wird ein FloatingActionButton erstellt, der am Ende und am unteren Rand des Bildschirms ausgerichtet wird.
Als Referenz werde ich meine alte Antwort behalten.
Vor der Einführung von ConstraintLayout war die Antwort ein relatives Layout .
Wenn Sie ein relatives Layout haben, das den gesamten Bildschirm ausfüllt, sollten Sie in der Lage sein,
android:layout_alignParentBottom
die Schaltfläche an den unteren Bildschirmrand zu verschieben.Wenn Ihre Ansichten unten nicht in einem relativen Layout angezeigt werden, nimmt das darüber liegende Layout möglicherweise den gesamten Platz ein. In diesem Fall können Sie die Ansicht, die sich unten befinden sollte, zuerst in Ihre Layoutdatei einfügen und den Rest des Layouts über den Ansichten mit positionieren
android:layout_above
. Dadurch kann die Unteransicht so viel Platz beanspruchen, wie sie benötigt, und der Rest des Layouts kann den gesamten Rest des Bildschirms ausfüllen.quelle
android:layout_above
?that RelativeLayout
ist speicherintensiv und sollte vermieden werden, wann immer es möglich ist.In einem
ScrollView
Fall funktioniert dies nicht, daRelativeLayout
sich dann alles überlappen würde, was sichScrollView
unten auf der Seite befindet.Ich habe es mit einer dynamischen Dehnung behoben
FrameLayout
:quelle
Sie können Ihr anfängliches lineares Layout beibehalten, indem Sie das relative Layout innerhalb des linearen Layouts verschachteln:
quelle
Die obige Antwort (von Janusz) ist ganz richtig, aber ich persönlich fühle mich mit RelativeLayouts nicht zu 100% wohl. Deshalb ziehe ich es vor, eine leere Textansicht wie folgt einzufügen:
vor dem Element, das sich am unteren Bildschirmrand befinden soll.
quelle
Sie können dies auch mit einem LinearLayout oder einer ScrollView tun. Manchmal ist es einfacher zu implementieren als ein RelativeLayout. Sie müssen lediglich die folgende Ansicht vor den Ansichten hinzufügen, die Sie am unteren Bildschirmrand ausrichten möchten:
Dadurch wird eine leere Ansicht erstellt, die den leeren Bereich ausfüllt und die nächsten Ansichten an den unteren Bildschirmrand verschiebt.
quelle
Das funktioniert auch.
quelle
1. Verwenden Sie
ConstraintLayout
in Ihrem Root-LayoutUnd stellen
app:layout_constraintBottom_toBottomOf="parent"
Sie das Layout am unteren Bildschirmrand ein:2. Verwenden Sie
FrameLayout
in Ihrem Root-LayoutStellen
android:layout_gravity="bottom"
Sie einfach Ihr Layout ein3. Verwenden Sie
LinearLayout
in Ihrem Root-Layout (android:orientation="vertical"
)(1) Legen Sie ein Layout
android:layout_weight="1"
oben in Ihrem Layout fest(2) Stellen Sie das Kind
LinearLayout
für einandroid:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"
Das Hauptattribut ist
ndroid:gravity="bottom"
, die untergeordnete Ansicht unten im Layout anzeigen zu lassen.4. Verwenden Sie
RelativeLayout
im Root-LayoutUnd stellen
android:layout_alignParentBottom="true"
Sie das Layout am unteren Bildschirmrand einAusgabe
quelle
Nach Timores 'eleganter Lösung habe ich festgestellt, dass im Folgenden eine vertikale Füllung in einem vertikalen LinearLayout und eine horizontale Füllung in einem horizontalen LinearLayout erstellt wird:
quelle
Sie müssen nicht einmal das zweite
relative
Layout im ersten verschachteln . Verwenden Sie die einfachandroid:layout_alignParentBottom="true"
in der Taste und EditText .quelle
Wenn Sie nicht viele Änderungen vornehmen möchten, können Sie einfach Folgendes sagen:
für die Textansicht mit der ID als
@+id/TextView
dhquelle
Hier ein Beispiel zum Erstellen von Kopf- und Fußzeilen :
Layout XML
Bildschirmfoto
quelle
Verwenden Sie den folgenden Code. Richten Sie die Schaltfläche auf Buttom aus. Es funktioniert.
quelle
Verwenden Sie in einem solchen Fall immer RelativeLayouts. Ein LinearLayout ist für eine solche Verwendung nicht vorgesehen.
quelle
Verwenden Sie
android:layout_alignParentBottom="true"
in Ihrem<RelativeLayout>
.Dies wird definitiv helfen.
quelle
Falls Sie eine Hierarchie wie diese haben:
Erstens gelten
android:fillViewport="true"
auf dasScrollView
und wenden Sie dannandroid:layout_alignParentBottom="true"
auf dieLinearLayout
.Das hat bei mir perfekt funktioniert.
quelle
Sie können Ihrer obersten untergeordneten Ansicht (TextView @ + id / TextView ) einfach ein Attribut geben :
android:layout_weight="1"
.Dadurch werden alle anderen Elemente darunter nach unten gedrückt.
quelle
Dies kann auch mit einem linearen Layout erfolgen.
Geben Sie einfach Höhe = 0 dp und Gewicht = 1 für das Layout oben und das gewünschte unten an. Schreiben Sie einfach height = Wrap Content und kein Gewicht.
Es enthält Zeilenumbruchinhalte für das Layout (das Ihren Bearbeitungstext und Ihre Schaltfläche enthält), und dasjenige, das Gewicht hat, nimmt den Rest des Layouts ein.
Ich habe das zufällig entdeckt.
quelle
Ich habe die von Janusz veröffentlichte Lösung verwendet, aber der letzten Ansicht wurde eine Auffüllung hinzugefügt, da der obere Teil meines Layouts eine ScrollView war.
Die ScrollView wird teilweise ausgeblendet, wenn sie mit dem Inhalt wächst. Wenn Sie
android:paddingBottom
die letzte Ansicht verwenden, wird der gesamte Inhalt in der ScrollView angezeigt.quelle