Android RelativeLayout:包装在ScrollView中时如何对齐ParentBottom?

Posted

技术标签:

【中文标题】Android RelativeLayout:包装在ScrollView中时如何对齐ParentBottom?【英文标题】:Android RelativeLayout : how to alignParentBottom when wrapped in a ScrollView? 【发布时间】:2011-03-08 18:26:18 【问题描述】:

我遇到的问题似乎是,如果我在设置为 alignParentBottom 的 RelativeLayout 中有一个视图(例如 myButton) - (根据下面的代码) - 然后用滚动视图包装 RelativeLayout(这是必要的,因此内容将在较小的屏幕上或当方向变为横向时可见) - 然后,当父底部不可见时(例如当变为横向时)myButton 显示在页面的顶部 - 而不是底部。

如何将视图与屏幕底部对齐并使其保持在底部,即使底部位于滚动条下方?

<ScrollView
android:id="@+id/mainScrollView"
android:layout_
android:layout_
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_
 android:layout_>



... lots of views and stuff


<Button android:layout_alignParentBottom="true" 
android:id="@+id/myButton"  
android:text="Click Me" />

</RelativeLayout>
</ScrollView>   

【问题讨论】:

你知道今天该怎么做吗? 【参考方案1】:

将按钮从滚动视图中取出,将滚动视图和按钮都包裹在线性布局中,设置滚动视图的高度为0dip并将其权重设置为1,不要为按钮设置任何权重属性,因此滚动视图可以占用所有剩余空间,仅节省底部按钮的空间方式。

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

    <ScrollView 
        android:layout_
        android:layout_
        android:layout_weight="1">
        <LinearLayout
            android:layout_
            android:layout_
            android:orientation="horizontal" >

        ....lots of views...


        </LinearLayout>
    </ScrollView>

    <Button
        android:id="@+id/button1"
        android:layout_
        android:layout_
        android:text="Button" />

</LinearLayout>

【讨论】:

但这会使Button 始终保持在屏幕底部,即使ScrollView 是可滚动的,对吧? 这是我喜欢的解决方案,但请注意“重量”对性能不利 好答案,现在解释为什么 0 中的layout_height1 中的layout_weight 对产生预期效果有效。【参考方案2】:

使用 fill_parent 作为 ScrollView 的孩子的高度是没有意义的。您是在告诉 RelativeLayout 始终与其父级一样高。在这种情况下,ScrollView 就变得毫无用处了! RelativeLayout 的高度应设置为 wrap_content,在这种情况下,根据 RelativeLayout 包含的内容,alignParentBottom 可能无法按预期工作。你应该简单地使用一个LinearLayout,它会简单得多。

【讨论】:

好吧,我不明白你为什么说scrollview变得没用了,它的功能是允许滚动,而且它这样做......所以我不得不使用它。我必须使用 RelativeLayout 才能使用 android_alignParentBottom。我看不出使用 LinearLayout 如何解决这个问题,因为我无法将 myButton 与屏幕底部对齐。是不是不能将视图对齐到屏幕底部并同时支持滚动? 如果孩子有height=fill_parent也没用。 fill_parent 的意思是“我想和我的父母一样高”。所以如果 ScrollView 的内容和 ScrollView 本身一样大,它就不会滚动。 好的。我很感激你的指导。但是,布局确实会滚动,这不是我要解决的问题。 我在解释为​​什么你的布局不能像你期望的那样工作,因为它不能通过使用 fill_parent。 嗨,Romain,我处于类似的情况(除了我被一些我无法编​​辑的代码绑定到 RelativeLayout)。 RelativeLayout 设置为 wrap_content,我的按钮布局设置为 alignParentBottom,但正如 OP 所说,按钮出现在 relativelayout 的顶部。是否有什么东西试图确保 relativelayout 的所有元素始终可见?【参考方案3】:

你可以试试这个

<LinearLayout android:id="@+id/parentLayout"
    android:layout_ android:layout_
    xmlns:android="http://schemas.android.com/apk/res/android">
    <ScrollView android:id="@+id/mainScrollView"
        android:layout_ android:layout_
        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_
            android:layout_>



            ... lots of views and stuff


            <Button android:layout_alignParentBottom="true" android:id="@+id/myButton"
                android:text="Click Me" />

        </RelativeLayout>
    </ScrollView>
</LinearLayout>

【讨论】:

谢谢哥们!我遇到了同样的问题,并开始认为这是不可能的。您的解决方案对我有很大帮助【参考方案4】:

这些解决方案都没有让我满意,所以我将发布我自己的解决方案。

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:fillViewport="true"
    android:orientation="vertical">

    <LinearLayout
        android:layout_
        android:layout_
        android:orientation="vertical">

        <!-- lots of stuff -->

        <Space
            android:layout_
            android:layout_
            android:layout_weight="1" />

        <Button
            android:layout_
            android:layout_ />

    </LinearLayout>

</ScrollView>

小解释:当空间很大时(例如纵向),空间视图将填充该空间并按下按钮。当没有空间时(例如横向),空间视图的高度将为 0,按钮将直接位于内容下方。

【讨论】:

是的,将此行添加到 RelativeLayout 会有所帮助。 android:fillViewport="true" 刚刚偶然发现,使用 有什么好处吗?您可以直接将gravity=bottom 和 height=0dp 和 weight=1 添加到按钮,如果具有相同的效果,不是吗?【参考方案5】:

有点晚了,不过最简单的办法就是加

android:below="@id/lots_of_stuffs"

像这样:

<ScrollView 
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/mainScrollView"
  android:layout_
  android:layout_
  android:fillViewport="true">

   <RelativeLayout
     android:id="@+id/topLayout"
     android:layout_
     android:layout_>


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

【讨论】:

有点晚了,仍然不是一个合适的解决方案,这会将按钮拉伸到它的填充高度。

以上是关于Android RelativeLayout:包装在ScrollView中时如何对齐ParentBottom?的主要内容,如果未能解决你的问题,请参考以下文章

Android相对布局(RelativeLayout)最全解析

Android 的 RelativeLayout 单元测试设置

Android五大布局之一相对布局(RelativeLayout)

Android布局之相对布局——RelativeLayout

Android 代码设置RelativeLayout元素居中

Android基础篇 RelativeLayout.LayoutParams