视图有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实现。)
如果有人正在考虑使用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) ));
如果有人正在考虑使用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) ));
我有一个答案:
https://stackoverflow.com/a/29178364/1148784
只需创建一个扩展ScrollView的新类并覆盖它的onMeasure方法。
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (maxHeight > 0){
int hSize = MeasureSpec.getSize(heightMeasureSpec);
int hMode = MeasureSpec.getMode(heightMeasureSpec);
switch (hMode){
case MeasureSpec.AT_MOST:
heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.min(hSize, maxHeight), MeasureSpec.AT_MOST);
break;
case MeasureSpec.UNSPECIFIED:
heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
break;
case MeasureSpec.EXACTLY:
heightMeasureSpec = MeasureSpec.makeMeasureSpec(Math.min(hSize, maxHeight), MeasureSpec.EXACTLY);
break;
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
如果可以的话,我会对whizzle的回答进行评论,但我认为为了让我在Android N的多窗口模式下解决这个问题,我需要稍微更改代码如下:
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if(MeasureSpec.getSize(heightMeasureSpec) > maxHeight) {
heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST);
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
这允许布局调整到小于最大高度,但也防止它大于最大高度。我使用这是一个覆盖RelativeLayout的布局类,这允许我创建一个自定义对话框,使用ScrollView作为MaxHeightRelativeLayout的孩子,它不会扩展屏幕的全部高度,也会缩小到适合Android N多窗口的最小寡妇大小。