关于android:如何在屏幕底部对齐视图?

How to align views at the bottom of the screen?

这是我的布局代码;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?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 Layout - Actual (Left) and Desired (Right)

显而易见的答案是将textview设置为在高度上填充父级,但这将导致按钮或输入字段没有剩余空间。本质上,问题是我希望提交按钮和文本条目在底部是固定高度,文本视图填充空间的其余部分,同样在水平线性布局中,我希望提交按钮包装其内容,文本条目填充空间的其余部分。

如果线性布局中的第一个项被告知要填充父项,那么它确实会这样做,不为其他项留任何空间,如何获得线性布局中的第一个项来填充除布局中其余项所需的最小空间之外的所有空间?

编辑:

相对布局确实是答案-谢谢!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
    <?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>


实现这一点的现代方法是使用app:layout_constraintBottom_toBottomOf="parent"将视图底部约束到约束布局的底部。

下面的示例创建一个浮动操作按钮,该按钮将与屏幕的末端和底部对齐。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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>

作为参考,我将保留我以前的答案。在引入约束布局之前,答案是相对布局。

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

如果底部的视图没有显示在相对布局中,那么上面的布局可能会占用所有空间。在这种情况下,您可以将视图放在底部,首先放在布局文件中,然后使用android:layout_above将布局的其余部分放在视图上方。这使得底部视图可以根据需要占用尽可能多的空间,布局的其余部分可以填充屏幕的其余部分。


ScrollView中,这不起作用,因为RelativeLayout会与页面底部的ScrollView中的内容重叠。

我用一个动态拉伸的FrameLayout修复了它:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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>


通过在线性布局中嵌套相对布局,可以保留初始线性布局:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<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>


上面的答案(Janusz)是非常正确的,但我个人觉得与相对布局不完全兼容,所以我更喜欢引入一个"填充",空文本视图,如下所示:

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

在屏幕底部的元素之前。


您也可以使用LinearLayout或ScrollView来完成此操作。有时实现起来比相对布局容易。唯一需要做的就是在视图与屏幕底部对齐之前添加以下视图:

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

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


这同样有效。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<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=


在Timores优雅的解决方案的后续工作中,我发现以下内容将创建一个垂直填充线,用于垂直线性布局,而水平填充线,用于水平线性布局:

1
2
3
4
<Space
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1" />


1.在根布局中使用EDOCX1[0]

设置EDOCX1[1]使布局在屏幕底部

1
2
3
4
5
6
7
<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.在根布局中使用EDOCX1[2]

只需在布局中设置EDOCX1[3]

1
2
3
4
5
6
7
<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"

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

(2)设置LinearLayout子项为android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="bottom"子项。

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

1
2
3
4
5
6
7
<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"使布局在屏幕底部

1
2
3
4
5
6
7
<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


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


如果您不想做很多更改,那么您可以将:

1
android:layout_weight="1"

对于ID为@+id/TextView的textview,即

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


创建页眉和页脚,这里是一个示例

[布局XML ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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

希望这是有帮助的。谢谢!!


使用下面的代码对齐按钮来阻止其工作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
    <?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>

对于这样的情况,总是使用相对布局。线性布局不适用于这种用途。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?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>

在你的中使用android:layout_alignParentBottom="true"

这肯定有帮助。


如果您有这样的层次结构:

1
2
3
<ScrollView>
  |-- <RelativeLayout>
    |-- <LinearLayout>

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

这对我很管用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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>

你只需给你的顶子视图(textview@+id/textview)一个属性:android:layout_weight="1"

这将强制它下面的所有其他元素到底部。


这也可以用线性布局来完成。只需在上面的布局中提供height=0dp和weight=1,在底部只需编写height=wrap content和no weight。它所做的是为布局提供包装内容(包含编辑文本和按钮的内容),然后具有权重的内容占据布局的其余部分。我是偶然发现的。


我使用了Janusz发布的解决方案,但在最后一个视图中添加了填充,因为我的布局的顶部是一个滚动视图。随着内容的增长,滚动视图将部分隐藏。在最后一个视图上使用android:paddingbottom有助于显示滚动视图中的所有内容。