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

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

  1. 致电家长的removeAllViews()
  2. 遍历一些对象,初始化子视图并添加addView()
  3. 计算新高度为:

    val previousMeasuredHeight = parentLayout.measuredHeight
    parentLayout.measure(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED)
    
  4. 将父布局动画到新高度:

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

我面临两个问题:

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

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

我该如何解决这些问题?

【问题讨论】:

    标签: java android view kotlin


    【解决方案1】:

    试试看animateLayoutChanges

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

    【讨论】:

    • 是的,我知道这一点,问题是因为它是一个可扩展的布局(CardView),因为它无法扩展到全高,所以我需要重新计算父级的实际大小有了新的孩子,如果没有,父母将隐藏孩子,因为它永远不会扩展到新的高度
    • 抱歉,我记得它可以与任何 ViewGroup 一起使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    相关资源
    最近更新 更多