385

我有一个LinearLayout内部 a ScrollViewandroid:layout_height="fill_parent"但它没有扩展到ScrollView. 我的布局看起来像:

level    layout    layout_width    layout_height
1    LinearLayout    fill_parent    fill_parent
2    LinearLayout    fill_parent    wrap_content
3    (some irrelevant stuff)
2    ScrollView      fill_parent    fill_parent <-- this expands full height
3    LinearLayout    fill_parent    fill_parent <-- this does not (has orientation=vertical)
(following stuff probably are irrelevant, but just to be sure:)
4    TextView        fill_parent    fill_parent
4    LinearLayout    fill_parent    wrap_content

我可以看到LinearLayout没有扩展 的完整高度,ScrollView因为在 Eclipse 中Android Layout Editor,如果我选择ScrollView(在大纲面板中)它会用红色边框突出显示,将屏幕填充到底部但是当我选择LinearLayout它的突出显示时不会扩展到屏幕底部。我怎样才能让它这样做?

我想要达到的效果是在它下面有一些文本和一个按钮(在LinearLayout第 4 层内只有一个按钮)。文本可以大到需要滚动条,在这种情况下,我希望用户必须向下滚动才能看到按钮。如果文本不够大,无法容纳滚动条,我希望LinearLayout包含的按钮贴在屏幕底部。

起初我认为我不应该发布完整的 XML,因为在一个问题中看到大量代码通常会让人拒绝。但是,这似乎是必要的,所以这里是完整的布局。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:id="@+id/video_layout"
        android:focusable="true"
        style="@style/VideoLayout">
        <FrameLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:foreground="@android:drawable/ic_media_play"
            android:foregroundGravity="center">
            <ImageView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/video_thumb"
                android:padding="5dip"
                android:background="#454545"/>
        </FrameLayout>
        <TextView
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:focusable="true"
            style="@style/VideoTitle"
            android:id="@+id/video_title"
            android:layout_gravity="center"
            android:layout_weight="1"/>
    </LinearLayout>
    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1">
        <!-- this ScrollView expands the full height of the screen.
             However, the next LinearLayout does not expand the full height of the ScrollView -->
        <LinearLayout
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:layout_gravity="fill"
            android:orientation="vertical"
            android:id="@+id/info_layout">
            <TextView
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:id="@+id/info_body"
                style="@style/InfoText"/>
            <LinearLayout
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                style="@android:style/ButtonBar">
                    <Button
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center"
                        android:layout_weight="1"
                        android:text="@string/button_readmore"
                        android:id="@+id/btn_read_more"/>
            </LinearLayout>
        </LinearLayout>
    </ScrollView>
</LinearLayout>

目前我已经求助于android:layout_gravity="bottom"有问题的LinearLayout,这使得按钮无论如何都粘在屏幕底部。但这也使文本粘在屏幕底部,这并不是我想要的。

更新:从头开始,android:layout_gravity="bottom"使ScrollView无法滚动。其他想法?

4

7 回答 7

992

最后自己找到了解决方案。问题不在于LinearLayout,而在于ScrollView(看起来很奇怪,考虑到ScrollView 正在扩展,而LinearLayout没有)。

解决方案是android:fillViewport="true"ScrollView.

于 2010-04-09T10:29:10.843 回答
24

我知道这篇文章很老了,对于那些不想使用的人,android:fillViewport="true"因为它有时不会在键盘上方显示编辑文本。使用相对布局而不是 LinearLayout 它解决了目的。

于 2015-09-14T07:12:57.197 回答
10

你能提供你的布局xml吗?这样做可以让人们以最小的努力重新创建问题。

您可能需要设置

android:layout_weight="1"

对于您要扩展的项目

于 2010-04-08T13:09:53.370 回答
7

解决方案是使用

android:fillViewport="true"

滚动视图上,此外尝试使用

"wrap_content"而不是"fill_parent"作为"fill_parent"

现在已弃用。

于 2018-09-21T12:50:53.260 回答
2

我已经动态地得到了这个。我有一个 LinearLayout 并在其中使用 ScrollView 作为孩子。然后我再次使用LinearLayout并将您想要的任何视图添加到此LinearLayout,然后将此LinearLayout添加到ScrollView,最后将此ScrollView添加到LinearLayout。然后你可以在你的 ScrollView 中滚动,并且什么都不会留下可见的。

LinearLayout(Parent)--ScrollView(LinerLayout 的子级)--LinearLayout(ScrollView 的子级)--在这里添加 textView、Buttons、spinner 等任何你想要的。然后将此 LinearLyout 添加到 ScrollView。Bcoz 只有一个适用于 ScrollView 的 CHILD,最后将此 ScrollView 添加到 LinearLyout。如果定义的区域超出屏幕尺寸,那么您将在 ScrollView 中获得一个 Scroll。

于 2010-12-09T18:58:44.373 回答
1

就我而言,我没有给出

LinearLayout 的方向(ScrollView 的子级)

所以默认情况下它是水平的,但是scrollview垂直滚动,所以请检查'android:orientation =“vertical”'是否设置为你的ScrollView的子级(在LinearLayout的情况下)。

这是我的情况希望它可以帮助某人

.

于 2015-02-03T07:47:30.860 回答
1

这里的所有答案对我来说(完全)都不起作用。回顾一下我们想要做的完整答案:我们有一个 ScrollView,据说填充了设备的视口,因此我们在布局 xml 中将 fillViewport 设置为“true”。然后,在 ScrollView 内部,我们有一个包含其他所有内容的 LinearLayout,LinearLayout 应该至少与其父 ScrollView 一样高,所以应该在底部的东西(LinearLayout)实际上是我们想要的,在屏幕底部(或在 ScrollView 的底部,以防 LinearLayout 的内容比屏幕高。

示例 activity_main.xml 布局:

<ScrollView
    android:id="@+id/layout_scrollwrapper"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fillViewport="true"
    android:layout_alignParentTop="true"
    android:layout_above="@+id/layout_footer"
    >
<LinearLayout
    android:id="@+id/layout_scrollwrapper_inner"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    >
...content which might or might not be higher than screen height...
</LinearLayout>
</ScrollView>

然后,在 Activity 的 onCreate 中,我们“等待”LinearLayout 的布局完成(意味着它的父级布局也已经完成),然后将它的最小高度设置为 ScrollView 的高度。因此,它也适用于 ScrollView 不占据整个屏幕高度的情况。无论您调用.post(...)ScrollView 还是内部 LinearLayout 都不会产生太大的影响,如果一个不适合您,请尝试另一个。

public class MainActivity extends AppCompatActivity {

@Override // Activity
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    LinearLayout linearLayoutWrapper = findViewById(R.id.layout_scrollwrapper_inner);

    ...

    linearLayoutWrapper.post(() -> {
        linearLayoutWrapper.setMinimumHeight(((ScrollView)linearLayoutWrapper.getParent()).getHeight());
    });
}
...
}

可悲的是,这不是一个仅限 xml 的解决方案,但它对我来说已经足够好了,希望它也能帮助其他一些受折磨的 android 开发人员在互联网上寻找解决这个问题的方法;D

于 2020-07-06T08:54:05.650 回答