将高度设置为自定义视图组
Posted
技术标签:
【中文标题】将高度设置为自定义视图组【英文标题】:Set Height to Custom ViewGroup 【发布时间】:2015-03-26 11:45:06 【问题描述】:我有一个自定义的Linearlayout
,它将一些视图组合在一起。我希望这个Linearlayout
是wrap_content
的高度。我尝试像这样在 custrucor 中添加布局参数
LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT);
setLayoutParams(params);
但它没有效果。高度仍然是match_parent
。我还尝试根据这样的孩子的身高计算onMeasure
中的身高
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
measureChildren(widthMeasureSpec,heightMeasureSpec);
int size = 0;
for(int i = 0; i <getChildCount();i++)
size += getChildAt(i).getMeasuredHeight();
int height = resolveSize(size,heightMeasureSpec);
setMeasuredDimension(widthMeasureSpec,height);
它也没有任何作用。那么问题出在哪里?
【问题讨论】:
您是否正在为任何孩子使用重量?你为这个 LinearLayout 子类使用什么方向? 我使用的是垂直方向,没有重量。计算儿童身高是正确的,但不适用 【参考方案1】:假设您的 LinearLayout
子类垂直排列视图,则覆盖 onMeasure
方法的代码应该可以工作:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
final int containerWidth = MeasureSpec.getSize(widthMeasureSpec);
final int containerHeight = MeasureSpec.getSize(heightMeasureSpec);
final int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(containerWidth, MeasureSpec.EXACTLY);
final int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(containerHeight, MeasureSpec.UNSPECIFIED);
View child;
int totalChildHeight = 0;
for (int i = 0; i < getChildCount(); i++)
child = getChildAt(i);
if (child == null || child.getVisibility() == View.GONE)
continue;
measureChildWithMargins(child, childWidthMeasureSpec, 0, childHeightMeasureSpec, totalChildHeight);
totalChildHeight += child.getMeasuredHeight();
setMeasuredDimension(containerWidth, totalChildHeight);
请记住,这实际上会覆盖LinearLayout's
测量逻辑。虽然这段代码几乎做同样的事情,除了以更明确的方式,它也完全忽略了给孩子的weights
,所以如果你需要weights
,你可能需要在这里应用更多的逻辑。
此外,我应该注意,此测量逻辑假定不存在填充。如果你有填充,你应该将totalChildHeight
初始化为bottomPadding
+topPadding
。
【讨论】:
【参考方案2】:嗨,在 onMeasure 方法中,您必须在计算所需的总高度后添加它,您必须使用 makeMeasureSpec,如下所述:
heightMeasureSpec = MeasureSpec.makeMeasureSpec(heightRequired, MeasureSpec.EXACTLY);
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
它对我有用...
【讨论】:
以上是关于将高度设置为自定义视图组的主要内容,如果未能解决你的问题,请参考以下文章
在 xcode 中的自定义视图中给出高度后刷新情节提要视图控制器