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> |
这看起来像是在左边,我想要它看起来像是在右边。
显而易见的答案是将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> |
实现这一点的现代方法是使用
下面的示例创建一个浮动操作按钮,该按钮将与屏幕的末端和底部对齐。
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> |
作为参考,我将保留我以前的答案。在引入约束布局之前,答案是相对布局。
如果您有一个填充整个屏幕的相对布局,您应该能够使用
如果底部的视图没有显示在相对布局中,那么上面的布局可能会占用所有空间。在这种情况下,您可以将视图放在底部,首先放在布局文件中,然后使用
在
我用一个动态拉伸的
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> |
在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.在根布局中使用
(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)设置
主要属性是
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.在根布局中使用
并设置
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> |
产量
您甚至不需要将第二个
如果您不想做很多更改,那么您可以将:
1 | android:layout_weight="1" |
对于ID为
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> |
[屏幕截图]
希望这是有帮助的。谢谢!!
使用下面的代码对齐按钮来阻止其工作
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> |
在你的
这肯定有帮助。
如果您有这样的层次结构:
1 2 3 | <ScrollView> |-- <RelativeLayout> |-- <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)一个属性:
这将强制它下面的所有其他元素到底部。
这也可以用线性布局来完成。只需在上面的布局中提供height=0dp和weight=1,在底部只需编写height=wrap content和no weight。它所做的是为布局提供包装内容(包含编辑文本和按钮的内容),然后具有权重的内容占据布局的其余部分。我是偶然发现的。
我使用了Janusz发布的解决方案,但在最后一个视图中添加了填充,因为我的布局的顶部是一个滚动视图。随着内容的增长,滚动视图将部分隐藏。在最后一个视图上使用android:paddingbottom有助于显示滚动视图中的所有内容。