15

我在尝试解决布局中具有静态高度可滚动区域的问题时遇到了很多麻烦。我有三个需要在同一个屏幕上显示的长列表,按顺序显示所有条目是完全不切实际的,因为如果你想跳过一个类别,你需要滚动过去可能有数百个条目。

假设我有一个滚动视图,里面有一个线性布局,我希望它在屏幕上占据最大 250dp 的高度,并且一旦填充了超过 250dp 空间的更多条目,它就可以独立滚动。

我现在拥有的是:

<ScrollView
    android:minWidth="25px"
    android:minHeight="150px"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:id="@+id/XXXXXXX"
    android:scrollbars="vertical">

    <LinearLayout
        android:orientation="vertical"
        android:minWidth="25px"
        android:minHeight="25px"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/XXXXXX" />
</ScrollView>

填充后,滚动视图和线性布局只需拉伸以适应内容并显示所有内容,而不是具有可在其中滚动的内容的 250dp/px 的“窗口”(任何测量都很好)。

我是 android 平台的新手,所以也许答案很明显,我只是不懂语言,但任何帮助将不胜感激!谢谢

--- 已解决:在具有高度的 ScrollView 之外放置一个线性布局。

4

4 回答 4

21

这个答案的一些帮助下,我设法包装了一个非常基本的 ScrollView 组件,您可以在这种情况下使用:

创建一个扩展 ScrollView 的自定义类并进行以下修改:

public class MaxHeightScrollView extends ScrollView {

    private int maxHeight;

    public MaxHeightScrollView(Context context) {
        super(context);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init(context, attrs);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init(context, attrs);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        init(context, attrs);
    }

    private void init(Context context, AttributeSet attrs) {
        if (attrs != null) {
            TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
            maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, 200); //200 is a default value
            styledAttrs.recycle();
        }
    }

   @Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
       heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
       super.onMeasure(widthMeasureSpec, heightMeasureSpec);
   }
}

然后剩下的一件小事是在您的 values 文件夹的 attrs.xml 文件中声明您的样式(如果您没有,只需在项目的 res 文件夹的 values 文件夹中创建一个具有此名称的 xml 文件)。在此处添加以下行:

<declare-styleable name="MaxHeightScrollView">
    <attr name="maxHeight" format="dimension" />
</declare-styleable>

并使用您的新 ScrollView 如下:

<com.yourpackage.MaxHeightScrollView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:maxHeight="300dp">
</com.yourpackage.MaxHeightScrollView>

学分很快就结束了!

于 2014-12-09T11:32:11.833 回答
4

我的简单解决方案。在 xml 中
设置高度:ScrollView

android:layout_height="wrap_content"

如果当前测量的高度 > 200,则添加此代码以将最大高度设置为 200

sv.measure(0, 0);
if (nsv.getMeasuredHeight() > 200) {
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                                      ViewGroup.LayoutParams.MATCH_PARENT, 200);
        sv.setLayoutParams(lp);
}

ScrollView在我的例子中是 into LinearLayout,所以我使用了LinearLayout.LayoutParams.

于 2016-04-27T13:38:28.200 回答
3

你需要的是一个maxHeight. 但是由于视图不支持它,您必须使用一种解决方法。

看看这个答案:

https://stackoverflow.com/a/13811461/770467

于 2013-07-16T18:18:31.967 回答
1

在 ScrollView 周围添加一个固定高度的布局

于 2019-06-28T15:11:16.923 回答