Android RelativeLayout : how to alignParentBottom when wrapped in a ScrollView?
我遇到的问题似乎是,如果我在RelativeLayout中设置了一个视图(例如myButton)设置为alignParentBottom - (根据下面的代码) - 然后使用scrollview包装RelativeLayout(必要时内容将在 较小的屏幕或方向更改为横向时 - 然后,当父母底部不可见时(例如,当更改为横向时)myButton显示在页面的顶部 - 而不是底部。
如何将视图与屏幕底部对齐并使其保持在底部,即使底部位于滚动下方?
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 | <ScrollView android:id="@+id/mainScrollView" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:fillViewport="true"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/topLayout" android:layout_width="fill_parent" android:layout_height="fill_parent"> ... lots of views and stuff <Button android:layout_alignParentBottom="true" android:id="@+id/myButton" android:text="Click Me" /> </RelativeLayout> </ScrollView> |
从SCrollview中取出按钮,将Scrollview和Button包裹在线性布局中,将scrollview的高度设置为0dip并将其权重设置为1,不要为按钮设置任何权重属性,因此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 | <?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"> <ScrollView android:layout_width="match_parent" android:layout_height="0dip" android:layout_weight="1"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> ....lots of views... </LinearLayout> </ScrollView> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="40dp" android:text="Button" /> </LinearLayout> |
使用fill_parent作为ScrollView子级的高度是没有意义的。您告诉RelativeLayout始终与其父级一样高。在这种情况下,ScrollView变得无用! RelativeLayout的高度应该设置为wrap_content,在这种情况下,根据RelativeLayout包含的内容,alignParentBottom可能无法按预期工作。你应该简单地使用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 | <LinearLayout android:id="@+id/parentLayout" android:layout_width="fill_parent" android:layout_height="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android"> <ScrollView android:id="@+id/mainScrollView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_weight="1" xmlns:android="http://schemas.android.com/apk/res/android" android:fillViewport="true"> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/topLayout" android:layout_width="fill_parent" android:layout_height="fill_parent"> ... lots of views and stuff <Button android:layout_alignParentBottom="true" android:id="@+id/myButton" android:text="Click Me" /> </RelativeLayout> </ScrollView> </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 | <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <!-- lots of stuff --> <Space android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" /> <Button android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> </ScrollView> |
一点点解释:当有很多空间(纵向为纵向)时,空间视图将填充该空间并按下按钮。当没有空间(f.e. in landscape)时,空间视图的高度为0,Button将直接位于内容之下。
这有点晚了,但最简单的解决方案是添加
1 | android:below="@id/lots_of_stuffs" |
像这样:
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 | <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mainScrollView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fillViewport="true"> <RelativeLayout android:id="@+id/topLayout" android:layout_width="fill_parent" android:layout_height="fill_parent"> <LinearLayout android:id="@+id/lots_of_stuffs"> ... lots of views and stuff </LinearLayout> <Button android:layout_alignParentBottom="true" android:id="@+id/myButton" android:text="Click Me" android:below="@id/lots_of_stuffs" /> <!-- Here is the"hack" --> </RelativeLayout> </ScrollView> |