视图有minHeight,但不知何故缺少maxHeight:

我要实现的是有一些项目(视图)填充一个ScrollView。当有1..3个项目,我想直接显示他们。意思是ScrollView有1,2或3个项的高度。

当有4个或更多的项目时,我希望ScrollView停止展开(因此是maxHeight)并开始提供滚动。

然而,不幸的是,没有办法设置maxHeight。所以我可能需要通过编程方式将ScrollView的高度设置为WRAP_CONTENT当有1。当有4个或更多的项目时,设置高度为3*sizeOf(视图)。

有人能解释为什么没有maxHeight提供,当已经有一个minHeight?

(BTW:一些视图,如ImageView有一个maxHeight实现。)


当前回答

MaxHeightScrollView自定义视图

public class MaxHeightScrollView extends ScrollView {
    private int maxHeight;

    public MaxHeightScrollView(Context context) {
        this(context, null);
    }

    public MaxHeightScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

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

    private void init(Context context, AttributeSet attrs) {
        TypedArray styledAttrs =
                context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView);
        try {
            maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_mhs_maxHeight, 0);
        } finally {
            styledAttrs.recycle();
        }
    }

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

style.xml

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

使用

<....MaxHeightScrollView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:mhs_maxHeight="100dp"
    >

    ...

</....MaxHeightScrollView>

其他回答

正如我们所知,运行android的设备可以有不同的屏幕尺寸。我们进一步知道,景观应该动态调整,成为合适的空间。

如果你设置了最大高度,你可能会迫使视图没有足够的空间或占用更少的空间。我知道有时候设置一个最大高度是很实际的。但如果分辨率会发生巨大变化,它会的!,则具有最大高度的视图将看起来不合适。

我认为没有正确的方法来精确地做你想要的布局。我建议你使用布局管理器和相关机制来考虑你的布局。我不知道你想要达到什么目的,但这听起来有点奇怪,一个列表应该只显示三个项目,然后用户必须滚动。

顺便说一句。minHeight不能保证(也许也不应该存在)。当其他相关的项目变得更小的时候,强制项目可见会有一些好处。

没有办法设置maxHeight。但是你可以设置高度。

要做到这一点,你需要发现你的scrollView的每个项目的高度。之后,设置你的scrollView高度为numberOfItens * hightofitem。

要发现一个项目的高度,可以这样做:

View item = adapter.getView(0, null, scrollView);
item.measure(0, 0);
int heightOfItem = item.getMeasuredHeight();

要设置高度,请执行以下操作:

// if the scrollView already has a layoutParams:
scrollView.getLayoutParams().height = heightOfItem * numberOfItens;
// or
// if the layoutParams is null, then create a new one.
scrollView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, heightOfItem * numberOfItens));

为了创建一个带有maxHeight的ScrollView或ListView,你只需要在它周围创建一个透明的线性布局,它的高度是你想要的maxHeight。然后将ScrollView的高度设置为wrap_content。这将创建一个ScrollView,它看起来会增长,直到它的高度等于父LinearLayout。

我认为你可以在运行时设置高度为1项scrollView.setHeight(200px),为2项scrollView.setHeight(400px)为3或更多的scrollView.setHeight(600px)

如果有人正在考虑使用LayoutParams的确切值。

setLayoutParams(new LayoutParams(Y, X );

记住要考虑到设备显示的密度,否则你可能会在不同的设备上看到非常奇怪的行为。例句:

Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics d = new DisplayMetrics();
display.getMetrics(d);
setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, (int)(50*d.density) ));