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_height
和1
中的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"
刚刚偶然发现,使用 有点晚了,不过最简单的办法就是加
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