将视图添加到滚动视图内的布局底部


67

所以我的布局基本上是这样的:

<ScrollView>
    <RelativeLayout>
        <BunchOfViews/>
        <ImageView android:layout_alignParentBottom="true"/>
    </RelativeLayout>
</ScrollView>

我拥有ScrollView这样的功能,无论屏幕的高度如何,所有布局都始终可见。问题是,在非常高的屏幕上,我仍然希望自己排ImageView在最下面。但是,一个孩子的孩子ScrollView似乎没有明确的底部。将View放置在布局的顶部。我该如何巧妙地解决这个问题?

Answers:


161

我遇到了同样的问题。我从来没有找到一个非常令人满意的解决方案,但是这就是我的方法。也许其他人有更好的方法,我讨厌添加不做任何事情的布局。

我的技巧是在滚动视图的底部添加一个虚拟的linearlayout,该布局具有fill_parent占据所有空间并强制滚动视图填充屏幕。然后将我想要的任何组件添加到该linearlayout中。

这是我执行此操作的布局之一:

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:layout_weight="1"
    android:fillViewport="true" >

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginTop="15px" >

        <!-- bunch of components here -->

        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_below="@+id/spinner"
            android:layout_marginTop="5px"
            android:gravity="center_horizontal|bottom"
            android:paddingTop="2px" >

            <Button
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:paddingLeft="20px"
                android:paddingRight="20px"
                android:text="Delete" />
        </LinearLayout>
    </RelativeLayout>
</ScrollView>

谢谢,我终于明白了。您使我的应用变得如此漂亮!:)
pgsandstrom

@dweebo我不明白。它对我不起作用。您能否更具体地说明代码,并显示<ScrollView>的结尾?
IgorGanapolsky

56
android:fillViewport是该技巧的重要部分,很容易错过。
daniel.gindi 2013年

2
'android:layout_below =“ @ + id / spinner”“部分可能不应该在'id'之前指定'+'...大概这不是第一次定义该ID的地方(定义在“这里的组件束”部分中的某个位置,在那里它将带有+ id)
jimmyorr 2014年

1
不推荐使用fill_parent。关于同一问题的答案更多,请参见stackoverflow.com/a/41120823/2614353
Tom Bevelander,

78

我遇到了同样的问题,并找到此页面:

http://www.curious-creature.org/2010/08/15/scrollviews-handy-trick/

基本上,将ScrollView的android:fillViewport值设置为true,这将允许子视图扩展到与ScrollView本身相同的高度,从而填充空间。然后,您只需要将子控件之一layout_height设置为fill_parentlayout_weight即可1,使该控件“弹起”以填充空白空间。

请注意,如果ScrollView的内容已经足够高以填充ScrollView,则android:fillViewport无效,因此该设置仅在需要时才启动。

我的最终XML类似于以下内容:

<ScrollView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:fillViewport="true">
    <LinearLayout
        android:orientation="vertical"
        android:layout_height="wrap_content">
        <LinearLayout
            android:layout_height="fill_parent"
            android:layout_weight="1">
            <!-- this expands to fill the empty space if needed -->
        </LinearLayout>

        <!-- this sits at the bottom of the ScrollView,
        getting pushed out of view if the ScrollView's
        content is tall enough -->
        <ImageView
            android:layout_height="wrap_content"
            android:src="@drawable/footer_image">
        </ImageView>
    </LinearLayout>
</ScrollView>

1
很好,但是我在屏幕上填充的项目是EditText,并且在键入大量行的情况下允许其增长到屏幕底部下方。有没有一种方法可以防止这种情况,以便只有在显示软键盘时才可以滚动视图?
finiteloop

1
这很棒。简单利落
Maggie

这应该是公认的答案,因为ScrollView的子高度应为wrap_content
Aleks Nine

非常感谢,对我来说就像魅力一样工作,它也适用于嵌套的滚动视图,我想为此要牢记两点-1-添加android:fillViewport="true"到ScrollView或NestedScrollView。2-设置android:layout_weight="1" 为内部LinearLayout。这是Romain Guy提供的相同解决方案的链接链接
shivam

如android studio所建议,请使用:android:layout_height="0dp"作为可扩展的布局
andreaciri

21

似乎线性布局不是必需的,重要的是fillViewPort。你可以用

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottomParent="true">

现在,您已经将相对布局指定为至少屏幕尺寸。


8
这实际上是可行的。答案不够清楚-添加fillViewPort="true"到您的网站中ScrollView
德米特里·扎伊采夫


8

乔尔·马龙(Joel Malone)的答案就是在滚动视图中的布局底部添加视图。我的解决方案几乎相同,除了我使用Space小部件来完成填充父布局内的其余高度的工作。像这样:

<ScrollView
    android:layout_width="match_parent"
    android:layout_height="match_parent
    android:fillViewport="true"
    >
    <LinearLayout
        android:orientation="vertical"
        android:layout_height="wrap_content"
        >
        <android.support.v4.widget.Space
            android:layout_height="match_parent"
            android:layout_weight="1"
            />
    <ImageView
        android:layout_height="wrap_content"
        android:src="@drawable/footer_image"
        />
    </LinearLayout>
</ScrollView>

注意:

  • fill_parent 在其他答案中,很长一段时间不推荐使用;
  • 与用空白LinearLayout填充父级布局的其余部分相比,我认为Space这更合适(它旨在完成该工作。)
  • 最后,不要忘了在ScrollView:开头的重要属性android:fillViewport="true"。他们一起做这个把戏。

1
虽然评分最高的方法有效,但这是我最喜欢的解决方案。使用Space是一个不错的技巧,它不需要额外的嵌套布局,但仍然可以与多个“底部连接”元素一起使用。
彼得

备注:既然layout_weight="1"已经设置,那么Space的高度应该设置为"0dp"。将高度设置为"match_parent"将显示相同的结果,但在Android Studio中显示警告。
Peter F

1
@PeterF是正确的;我个人喜欢将高度设置为match_parent(更容易理解)。由于IDE这么说,因此应建议将其设置为0dp。
Anthonyeef

1

在您希望位于最底部的视图上,请使用android:gravity =“ bottom”


0

发件人:http : //code.google.com/p/k9mail/source/browse/k9mail/trunk/res/layout/account_setup_basics.xml?r=1314

这应该可以帮助您:

<RelativeLayout
        android:layout_marginTop="-45dip" 
        android:padding="0dip"
        android:layout_alignParentBottom="true"
        android:gravity="bottom|right" 
        android:background="@android:drawable/bottom_bar"
        android:layout_height="fill_parent"
        android:layout_width="fill_parent">
        <Button
            android:id="@+id/manual_setup"
            android:text="@string/account_setup_basics_manual_setup_action"
            android:minWidth="@dimen/button_minWidth"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:layout_marginBottom="-4dip" 
            android:layout_alignParentLeft="true"
            android:layout_centerVertical="false" 
            />
        <Button
            android:id="@+id/next"
            android:text="@string/next_action"
            android:minWidth="@dimen/button_minWidth"
            android:layout_height="wrap_content"
            android:layout_width="wrap_content"
            android:drawableRight="@drawable/button_indicator_next"
            android:layout_marginBottom="-4dip" 
            android:layout_alignParentRight="true"
            android:layout_centerVertical="false" 
            />
    </RelativeLayout>

对不起,但我认为我不够清楚。我仍然希望imageview成为滚动视图的一部分,就像我当前的布局一样。它应该只是在滚动视图的底部。如果滚动视图短于屏幕,则图像视图仍应位于屏幕底部。
pgsandstrom

我也不太了解像素数上有负数的影响。我从来没有用过这些。所以也许我只是不明白你想说什么。如果是这样,请您详细说明一下?:P谢谢。
pgsandstrom

1
我不明白,如果您的内容没有填满屏幕,为什么需要滚动视图。android:gravity="bottom|right" 在视图上使用应该放在底部。负值可能是为了减少按钮布局内的多余填充。
Pentium10年

0
ScrollView view = new ScrollView( this );
ScrollView.LayoutParams lps = new FrameLayout.LayoutParams( FILL_PARENT, FILL_PARENT, Gravity.CENTER );
LinearLayout layout = new LinearLayout( this );
// what ever you want in the Layout 
view.addView( layout, lps );

您应该始终喜欢在XML中设置布局高度和宽度,避免在代码中这样做。
JaydeepW 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.