将高度设置为自定义视图组

Posted

技术标签:

【中文标题】将高度设置为自定义视图组【英文标题】:Set Height to Custom ViewGroup 【发布时间】:2015-03-26 11:45:06 【问题描述】:

我有一个自定义的Linearlayout,它将一些视图组合在一起。我希望这个Linearlayoutwrap_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);

它对我有用...

【讨论】:

以上是关于将高度设置为自定义视图组的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中将内容包装为自定义视图

在 xcode 中的自定义视图中给出高度后刷新情节提要视图控制器

在xcode中自定义视图中给出高度后刷新故事板视图控制器

如何为一组自定义分类页面创建可变页面标题

UITableView 标题部分的高度不会为自定义 UIView() 类自动调整

为自定义活动指示器视图使 UIView 半透明