动态添加视图并调整父视图组的大小

Posted

技术标签:

【中文标题】动态添加视图并调整父视图组的大小【英文标题】:Add views dynamically and resize parent ViewGroup 【发布时间】:2018-06-09 16:09:17 【问题描述】:

我正在尝试创建一个可展开/可折叠的CardView(根布局),我将在其中动态地将视图添加到垂直的LinearLayout(父布局),特别是TextInputLayouts。添加视图后,我想调整布局动画流程以适应新添加的视图。我正在做的是:

    致电家长的removeAllViews() 遍历一些对象,初始化子视图并添加addView()

    计算新高度为:

    val previousMeasuredHeight = parentLayout.measuredHeight
    parentLayout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
    

    将父布局动画到新高度:

    val animator = ValueAnimator.ofInt(previousMeasuredHeight, measuredHeight)
    animator.addUpdateListener  valueAnimator ->
        layoutParams.height = valueAnimator.animatedValue as Int
        setLayoutParams(layoutParams)
    
    animator.start()
    

我面临两个问题:

    当必须显示 TextInputLayout 的错误标签时,它是不可见的,因为父级不够大,无法考虑错误标签占用的高度。我想这与使用 getMeasuredHeight() 而不是计算所需总高度的正确方法有关 当我添加更多视图并展开父布局时,只有最后添加的视图是可见的,因为它位于父布局的顶部

我也尝试使用RecyclerView,但也存在一些问题,例如添加项目时未显示,或者父布局未正确调整大小

我该如何解决这些问题?

【问题讨论】:

【参考方案1】:

试试看animateLayoutChanges。

它看起来适合您想要实现的目标,并且应该消除您自己计算高度和制作动画的麻烦。

【讨论】:

是的,我知道这一点,问题是因为它是一个可扩展的布局(CardView),因为它无法扩展到全高,所以我需要重新计算父级的实际大小有了新的孩子,如果没有,父母将隐藏孩子,因为它永远不会扩展到新的高度 抱歉,我记得它可以与任何 ViewGroup 一起使用。

以上是关于动态添加视图并调整父视图组的大小的主要内容,如果未能解决你的问题,请参考以下文章

动态添加文本后Textview不调整大小?

Swift - 在标签中动态调整大小后动态调整视图大小

在表格视图单元格中动态调整子视图的大小

关闭模态视图并调整父视图的大小?

UIScrollView 高度不会根据视图大小动态更新?

iOS 8 自动布局 - 动态调整 4 个方形视图的大小