Android RelativeLayout:如何在ScrollView中包装alignParentBottom?

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>