Android:为什么没有一个视图的maxHeight?

视图有minHeight但不知何故缺lessmaxHeight

我想实现的是有一些项目(视图)填满了ScrollView 。 当有1..3个项目时,我想直接显示它们。 这意味着ScrollView具有1,2或3个项目的高度。

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

但是,不幸的是没有办法设置maxHeight 。 所以我可能必须设置我的ScrollView高度以编程方式为WRAP_CONTENT有1..3项目,并设置高度为3*sizeOf(View)有4个或更多的项目时。

任何人都可以解释为什么没有提供maxHeight ,当已经有一个minHeight

(顺便说一句:一些意见,像ImageView有一个maxHeight实施。)

这些解决scheme都没有为我所需要的是一个滚动视图设置为wrap_content,但有一个maxHeight,所以它会停止扩展后,一定的点,并开始滚动。 我只是简单地覆盖了ScrollView中的onMeasure方法。

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

这可能不适用于所有情况,但它肯定会给我布局所需的结果。 它也解决了madhu的评论。

如果一些布局出现在scrollview的下方,那么这个技巧就不能工作了 – madhu 3月5日4:36

为了创build一个带有maxHeight的ScrollView或者ListView ,你只需要在它的周围创build一个透明的LinearLayout,使其具有你想要的maxHeight的高度。 然后您将ScrollView的高度设置为wrap_content 。 这将创build一个ScrollView,它的高度等于父LinearLayout。

这对我来说可以在xml中进行自定义:

MaxHeightScrollView.java:

 public class MaxHeightScrollView extends ScrollView { private int maxHeight; private final int defaultHeight = 200; public MaxHeightScrollView(Context context) { super(context); } public MaxHeightScrollView(Context context, AttributeSet attrs) { super(context, attrs); if (!isInEditMode()) { init(context, attrs); } } public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); if (!isInEditMode()) { init(context, attrs); } } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public MaxHeightScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); if (!isInEditMode()) { init(context, attrs); } } private void init(Context context, AttributeSet attrs) { if (attrs != null) { TypedArray styledAttrs = context.obtainStyledAttributes(attrs, R.styleable.MaxHeightScrollView); //200 is a defualt value maxHeight = styledAttrs.getDimensionPixelSize(R.styleable.MaxHeightScrollView_maxHeight, defaultHeight); styledAttrs.recycle(); } } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { heightMeasureSpec = MeasureSpec.makeMeasureSpec(maxHeight, MeasureSpec.AT_MOST); super.onMeasure(widthMeasureSpec, heightMeasureSpec); } } 

attr.xml

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

示例布局

 <blah.blah.MaxHeightScrollView android:layout_weight="1" app:maxHeight="90dp" android:layout_width="fill_parent" android:layout_height="wrap_content"> <EditText android:id="@+id/commentField" android:hint="Say Something" android:background="#FFFFFF" android:paddingLeft="8dp" android:paddingRight="8dp" android:gravity="center_vertical" android:maxLines="500" android:minHeight="36dp" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </blah.blah.MaxHeightScrollView> 

如果可以的话,我会评论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的布局类,这允许我创build一个自定义的对话框,使用ScrollView作为MaxHeightRelativeLayout的子MaxHeightRelativeLayout ,它不扩展屏幕的整个高度,也缩小到适合MaxHeightRelativeLayout中最小的寡妇大小。 Android N的窗口

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

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

要发现一个项目的高度做到这一点:

 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)); 

你有没有尝试过使用layout_weight值 ? 如果将其设置为大于0的值,则会将该视图拉伸到可用的剩余空间中。

如果你有多个视图需要拉伸,那么这个值将成为它们之间的权重。

所以,如果你有两个视图都设置为1的layout_weight值,那么他们都会伸展来填充空间,但他们都伸展到相等的空间量。 如果你将其中一个设置为2,那么它将拉伸两倍于另一个视图。

这里列出一些更多的信息列在线性布局下

正如我们所知,运行android的设备可以有不同的屏幕尺寸。 正如我们进一步认识的看法应该dynamic调整,成为适当的空间。

如果设置最大高度,则可能会强制视图不能获得足够的空间或占用较小的空间。 我知道,有时似乎实际上是设置最大高度。 但是,如果分辨率将会发生巨大的变化,那么最大高度的视图看起来就不合适了。

我认为没有正确的方法来完成你想要的布局。 我会build议你使用布局pipe理器和相关机制来思考你的布局。 我不知道你想要达到什么目标,但是对于我来说这听起来有点奇怪,一个列表应该只显示三个项目,然后用户必须滚动。

顺便说一句。 minHeight不能保证(也许不应该存在)。 它可以有一些好处,强制项目可见,而其他相关项目变小。

如果有人正在考虑使用精确值的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) )); 

我认为你可以在运行时设置heiht 1个项目只是scrollView.setHeight(200px) ,2项scrollView.setheight(400px)为3或更多scrollView.setHeight(600px)

首先以像素为单位获取物品高度

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

然后干脆

 Display display = getWindowManager().getDefaultDisplay(); DisplayMetrics displayMetrics = new DisplayMetrics(); display.getMetrics(displayMetrics); scrollView.getLayoutParams().height = (int)((heightOfItem * 3)*displayMetrics .density); 

如果你们想做一个非溢出的滚动视图或列表视图,只是它在一个具有顶视图和底视图的RelativeLayout上:

 <ScrollView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_above="@+id/topview" android:layout_below="@+id/bottomview" >