ScrollView没有正确调整自身大小

时间:2015-05-12 14:51:41

标签: android android-layout android-scrollview

我正在尝试让ScrollView占用尽可能多的屏幕空间,直到它开始将其下方(外部)的项目推离屏幕,然后它需要停止展开并变为滚动。

<?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="wrap_content"
          android:background="#ff0000"
    >
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable"
        /> 
        <!-- 
            android:text="just one line"
        -->
    </ScrollView>

    <Button
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:text="Button"
    />
</LinearLayout>

当它在上方时,ScrollView会填满整个屏幕高度,并将按钮从屏幕底部推开。 如果我将android:layout_weight="1"添加到ScrollView然后它适用于这种情况 - 按钮位于底部,ScrollView停在它上面 - 但是当ScrollView没有太多内容时(用单行替换文本) )然后ScrollView不缩小以适应内容,所以太高了。

我尝试过使用RelativeLayout但没有成功 - 如果Button是android:layout_below ScrollView,那么如果ScrollView内容很多,ScrollView会将其推离屏幕底部。

这就是我想要它的样子:在第一张图片中,ScrollView有很多内容,因此扩展以填充可用高度,但不会将其下方的项目(按钮)推到屏幕外,在第二张图像中ScrollView没有太多内容,所以只占用它需要的高度,允许它下面的项目(按钮)向上移动: ScrollView has a lot of content SrollView doesn't have much content

3 个答案:

答案 0 :(得分:1)

您可以做的是更正代码中的高度。这有点hacky我希望看到另一个解决方案,但是我不知道更好。

您需要添加OnGlobalLayoutListener并在其中计算ScrollView高度或ScrollView周围容器高度减去Button高度的最小值{1}}。

然后在setLayoutParams()上设置ScrollView的尺寸。

你必须删除监听器以避免无限循环: - )

    final View scrollview = findViewById(R.id.scrollview);
    final View container = findViewById(R.id.container);
    final View button = findViewById(R.id.button);
    scrollview.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            int height = scrollview.getHeight();
            int heightButton = button.getHeight();
            int heightContainer = container.getHeight();
            int min = Math.min(heightContainer - heightButton, height);
            int width = scrollview.getWidth();
            Log.v("test", "min: " + min);
            scrollview.setLayoutParams(new RelativeLayout.LayoutParams(width, min));

            // do not forget to remove the listener
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
                scrollview.getViewTreeObserver().removeOnGlobalLayoutListener(this);
            }
            else {
                scrollview.getViewTreeObserver().removeGlobalOnLayoutListener(this);
            }
        }
    });

为此,您必须使用wrap_content作为布局文件中ScrollView的高度。并且外部容器必须是RelativeLayout,以便呈现Button并且具有非零高度!

如果使用填充或边距,则必须在计算中考虑这些值。

答案 1 :(得分:0)

试试这个:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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="match_parent"
        android:layout_above="@+id/button"
        android:background="#ff0000">
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">
            <TextView
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable" />
            <TextView
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable" />
            <TextView
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable" />
            <TextView
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable" />
            <TextView
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable" />
            <TextView
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable" />
            <TextView
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable" />
            <TextView
                android:padding="5dp"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:text="taking\nup\lots\nof\nlines\nto\nmake\nthe\nscrollview&quot;s\ncontent\ntaller\nthan\nthe\nspace\navailable\nto\nit\nwhich\nshould\nmake\nthe\nscrollview\nstop\nabove\nthe\nbutton\nand\nbecome\nscrollable" />
        </LinearLayout>
    </ScrollView>
    <Button
        android:id="@+id/button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="Button" />
</RelativeLayout>

答案 2 :(得分:0)

尝试添加fillViewport =&#34; true&#34;滚动视图