我如何在屏幕底部对齐视图?

这是我的布局代码;

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

左边是这个样子,右边是我想要的样子。

Android布局-实际(左)和期望(右)

显而易见的答案是将TextView设置为高度上的fill_parent,但这导致没有空间留给按钮或输入字段。

本质上的问题是,我希望提交按钮和文本条目在底部有一个固定的高度,而文本视图填充其余的空间。类似地,在水平线性布局中,我希望提交按钮包装其内容,并让文本条目填充其余空间。

如果线性布局中的第一项被告知fill_parent,它就会执行fill_parent,不为其他项留下任何空间。我如何得到一个项目,这是第一个在线性布局,以填补所有空间除了最小要求的其余项目在布局?


相对布局确实是答案:

    <?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>
607746 次浏览

现代的方法是使用ConstraintLayout并使用app:layout_constraintBottom_toBottomOf="parent"将视图的底部约束到ConstraintLayout的底部

下面的例子创建了一个FloatingActionButton,它将对齐到屏幕的末端和底部。

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

作为参考,我将保留我的旧答案。

在引入ConstraintLayout之前,答案是相对布局


如果你有一个填充整个屏幕的相对布局,你应该能够使用android:layout_alignParentBottom将按钮移动到屏幕底部。

如果你在底部的视图没有显示在一个相对的布局,那么上面的布局可能会占用所有的空间。在这种情况下,你可以把视图,它应该在底部,首先在你的布局文件和位置的其余布局上面的视图与android:layout_above。这使得底部视图可以占用尽可能多的空间,而布局的其余部分可以填充屏幕的其余部分。

您甚至不需要将第二个relative布局嵌套在第一个布局中。简单地在按钮EditText中使用android:layout_alignParentBottom="true"

ScrollView中,这行不通,因为RelativeLayout会重叠页面底部的ScrollView中的任何内容。

我使用动态拉伸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>

上面的答案(由Janusz)是相当正确的,但我个人不觉得100%舒适的RelativeLayouts,所以我更喜欢引入一个“填充”,空的TextView,像这样:

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

在应该在屏幕底部的元素之前。

你可以通过在线性布局中嵌套相对布局来保持初始线性布局:

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

如果你不想做太多改动,你可以输入:

android:layout_weight="1"

对于TextView有ID为@+id/TextView,即

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

这也是可行的。

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

我使用了Janusz发布的解决方案,但我在最后一个视图中添加了填充,因为我的布局的顶部是一个ScrollView。

ScrollView会随着内容的增长而部分隐藏。在最后一个视图上使用android:paddingBottom有助于显示ScrollView中的所有内容。

你也可以用LinearLayout或ScrollView来做这个。有时候它比RelativeLayout更容易实现。你唯一需要做的就是添加下面的视图之前你想要对齐到屏幕底部的视图:

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

这将创建一个空视图,填充空白空间并将下一个视图推到屏幕底部。

<RelativeLayout>中使用android:layout_alignParentBottom="true"

这肯定会有帮助。

线性布局也可以做到这一点。

只需要为上面的布局和底部的布局提供Height = 0dp和weight = 1即可。只写高度=包装内容,不写重量。

它为布局提供换行内容(包含编辑文本和按钮的内容),然后有权重的内容占据布局的其余部分。

这是我偶然发现的。

使用下面的代码。将按钮与按钮对齐。这是工作。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >


<Button
android:id="@+id/btn_back"
android:layout_width="100dp"
android:layout_height="80dp"
android:text="Back" />


<TextView
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="0.97"
android:gravity="center"
android:text="Payment Page" />


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >


<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>


<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Submit"/>
</LinearLayout>


</LinearLayout>

如果你有一个这样的层次结构:

<ScrollView>
|-- <RelativeLayout>
|-- <LinearLayout>

首先,应用android:fillViewport="true"ScrollView,然后应用android:layout_alignParentBottom="true"LinearLayout

这对我来说非常有效。

<ScrollView
android:layout_height="match_parent"
android:layout_width="match_parent"
android:scrollbars="none"
android:fillViewport="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:id="@+id/linearLayoutHorizontal"
android:layout_alignParentBottom="true">
</LinearLayout>
</RelativeLayout>
</ScrollView>

创建页脚,下面是一个例子:

布局的XML

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/backgroundcolor"
tools:context=".MainActivity">


<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="40dp"
android:background="#FF0000">
</RelativeLayout>


<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="40dp"
android:layout_alignParentBottom="true"
android:background="#FFFF00">
</RelativeLayout>


</RelativeLayout>

截图

Enter image description here

对于这种情况,总是使用RelativeLayouts。线性布局不是为这样的用法而设计的。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/db1_root"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >


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


<!-- Place your layout here -->


</LinearLayout>


<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_gravity="bottom"
android:orientation="horizontal"
android:paddingLeft="20dp"
android:paddingRight="20dp" >


<Button
android:id="@+id/setup_macroSavebtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Save" />


<Button
android:id="@+id/setup_macroCancelbtn"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="Cancel" />


</LinearLayout>


</RelativeLayout>

跟进Timores的优雅解决方案,我发现以下创建一个垂直填充在垂直线性布局和水平填充在水平线性布局:

<Space
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1" />
你可以给你的顶级子视图(textview# EYZ0)一个属性: # EYZ0。< / p >

这将迫使它下面的所有其他元素移到底部。

1. 在根布局中使用ConstraintLayout

设置app:layout_constraintBottom_toBottomOf="parent"让布局在屏幕底部:

<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. 在根布局中使用FrameLayout

只需在布局中设置android:layout_gravity="bottom"即可

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

3.在根布局中使用LinearLayout (android:orientation="vertical")

(1)在你的布局顶部设置一个android:layout_weight="1"的布局

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

(2)设置子元素LinearLayoutandroid:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"

主属性是ndroid:gravity="bottom",让子视图位于布局的底部。

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

4. 在根布局中使用RelativeLayout

并设置android:layout_alignParentBottom="true"让布局在屏幕底部

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

输出

Enter image description here