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" >