首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当ConstraintLayout高度发生变化时,安卓自定义ConstraintLayout无法更新子高度

当ConstraintLayout的高度发生变化时,安卓自定义ConstraintLayout无法自动更新子控件的高度。这是因为ConstraintLayout是一种灵活的布局容器,它使用约束来定义子控件之间的相对位置和大小。当父容器的高度发生变化时,子控件的约束条件并不会自动更新,导致子控件的高度无法正确适应新的布局。

为了解决这个问题,可以通过以下步骤来手动更新子控件的高度:

  1. 监听父容器高度的变化:可以通过重写父容器的onMeasure()方法,在该方法中获取父容器的新高度。
  2. 更新子控件的约束条件:根据新的父容器高度,更新子控件的约束条件。可以使用ConstraintSet类来修改约束条件。
  3. 应用更新后的约束条件:调用ConstraintLayoutConstraintSet.applyTo()方法,将更新后的约束条件应用到子控件上。

以下是一个示例代码,演示如何手动更新子控件的高度:

代码语言:txt
复制
public class CustomConstraintLayout extends ConstraintLayout {

    public CustomConstraintLayout(Context context) {
        super(context);
    }

    public CustomConstraintLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomConstraintLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        // 获取新的父容器高度
        int newHeight = MeasureSpec.getSize(heightMeasureSpec);

        // 更新子控件的约束条件
        ConstraintSet constraintSet = new ConstraintSet();
        constraintSet.clone(this);
        constraintSet.constrainHeight(R.id.childView, newHeight);

        // 应用更新后的约束条件
        constraintSet.applyTo(this);
    }
}

在上述示例中,我们重写了onMeasure()方法,在方法中获取了新的父容器高度,并使用ConstraintSet类更新了子控件的约束条件,最后调用applyTo()方法应用了更新后的约束条件。

这样,当ConstraintLayout的高度发生变化时,自定义的ConstraintLayout会自动更新子控件的高度,确保布局的正确显示。

推荐的腾讯云相关产品:腾讯云移动应用分析(MTA),该产品提供了移动应用数据分析和用户行为分析的能力,可以帮助开发者深入了解用户行为和应用性能,优化移动应用的用户体验。产品介绍链接地址:https://cloud.tencent.com/product/mta

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【错误记录】Android Studio 布局文件报错 ( View with id -1: xx.MyView#onMeasure() did not set the measured dime )

一、报错信息 在 ConstraintLayout 约束布局中 , 引入了自定义 View 后 , 整个 Design 图形化操作界面没了 , 报错信息如下 : java.lang.IllegalStateException...() 来设置 View 或 ViewGroup 的测量宽度和高度。...以下是一个示例,在这个示例中,自定义 View 的 onMeasure() 方法调用了 setMeasuredDimension() 来设置 View 的测量宽度和高度。...然后 , 使用一个固定的宽高比(0.75f)计算出视图的高度。 最后 , 调用 setMeasuredDimension() 方法来设置视图的测量宽度和高度。...实现 onMeasure() 方法,必须在最后 调用 setMeasuredDimension() 来设置视图的测量宽度和高度

67310

Jetpack-Compose 学习笔记(二)—— Compose 布局你学会了么?

所以一般是使用 LazyColumn 来展示列表数据,LazyColumn 开始并不会把所有的列表数据都加载进内存,它会先将展示在屏幕上的列表数据加载进内存,滑动查看更多列表数据,才会将这些数据加载到内存中...ConstraintLayout 约束布局 众所周知,Android View 体系中官方最推荐的布局是约束布局 —— ConstraintLayout,以致于在默认新建布局就给你初始化成 ConstraintLayout...而 guideline2 是在竖直方向上距离屏幕高度三分之一的位置,需要把父布局的高度设置为屏幕高度才可以实现。...ConstraintLayout 还有一个特性,就是它的元素过大ConstraintLayout 默认是可以允许元素超出屏幕范围的,以上面的例子继续说,横向的 Text 内容很多时,就会出现...官方将这个 api 标记为可以改进的状态,可能后续会发生变化

3.1K31
  • Android入门教程 (一) Android简介和android studio安装

    我们的手机,比如华为、VIVO、小米、三星等等都是使用系统。而我们学习Android开发,就是学习制作APP的技能。至于Android底层的实现,我们等到会用了再去研究。...接着就弹出欢迎界面,开始让你配置Android Studio,我们选择下一步 接着就让我们选择一系列的设置,什么是否自定义安装,要什么背景颜色,这些都无关紧要,我没写的无脑next即可。...Android的我们,新建的是空白的APP应用,选择Empty Activity,即空项目 之后会让我们设置AS项目的详细信息,至于项目名、包名就随意了,我们又不写什么项目,只是练练手而已。...> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res...文本 layout_width/layout_height分别是该组件的宽度高度 wrap_content代表包裹自身内部组件的大小,即里面的东西有多大,我就有多大 text是文本框的文字,我们可以修改为自己喜欢的文字

    36420

    布局大杀器—ConstraintLayout

    说明:本博文是以 ConstraintLayout1.1.3为基础编写,不同的依赖版本有不同的属性和方法,如果依照博文编写 demo发现编译出错,请自行研究更新版本的约束布局或者与博主版本保持一致。...左相关的长度/(View左相关的长度+其右相关的长度) 2.bias值与左相关的长度是成正比的,增大bias值,View的左相关总是随之增长。...ConstraintLayout 布局的宽或高设置为0dp,可以对宽或高设置百分比 <Button android:layout_width="0dp" android...设置宽高比例 layout_width或者 layout_height设置为0dp,还可以通过 layout_constraintDimensionRatio设置宽高比例。...强制约束 一个 view的宽或高,设置成 wrap_content <Button android:id="@+id/btn1" android:layout_width

    1.6K30

    【Android 屏幕适配】屏幕适配通用解决方案 ⑤ ( 自定义组件解决方案 | 自定义 ViewGroup 组件 onMeasure 方法中计算每个子组件坐标数据 | 自定义组件完整代码 )

    计算出在当前设备中每个组件的 实际坐标数据 ; 在博客 【Android 屏幕适配】屏幕适配通用解决方案 ③ ( 自定义组件解决方案 | 获取设备状态栏高度 | 获取设备屏幕数据 ) 中 , 完成了前两项工作..., 已经获取了实际的屏幕数据 , 状态栏高度 ; 在博客 【Android 屏幕适配】屏幕适配通用解决方案 ④ ( 自定义组件解决方案 | 计算设计稿与实际布局的比例系数 ) 中 , 计算了设计稿与实际布局的比例系数...---- 首先 , 获取自定义 ViewGroup 组件的组件的个数 ; // 获取该 ViewGroup 组件个数 int childCount...android.util.DisplayMetrics; import android.view.View; import android.view.WindowManager; import androidx.constraintlayout.widget.ConstraintLayout...{ /** * 自定义布局中的组件坐标数据是否需要进行换算 */ static boolean isCaculateFlag = true; /**

    29410

    探索 MotionLayout 动画世界

    ", version.ref = "constraintlayout" } ConstraintLayout 的版本需要更新到2.0以上。...maxVelocity :定义最大速度,拖拽速度超过该值,视图将不再响应拖拽事件。 maxAcceleration :定义最大加速度,拖拽加速度超过该值,视图将不再响应拖拽事件。...bounceEnd :拖拽到结束位置弹簧会弹动。 bounceBoth :拖拽到开始或结束位置弹簧会弹动。 rotationCenterId :定义旋转中心的视图 ID。...= 1),framePosition = 50 ,view位于坐标系中(0.5,0.2)的位置,宽度变为 0.8,高度变为0.8,相当于此时view的宽高为 600px x 0.8。...这里设置ImageView和View的开始是宽度为match_parent,高度为360px,结束宽度不变,高度为120px。并设置ImageView结束的尺寸比为 4 :3。

    13410

    Android ConstraintLayout百分比布局使用详解

    Android ConstraintLayout是谷歌推出替代PrecentLayout的组件。...支持相对布局、线性布局、帧布局,笔者看来更像是FrameLayout 、LinearLayout、RelativeLayout三者的结合体,并且比这三者更强大的是实现了百分比布局,大家都知道碎片严重...与父View长度相同,只需要将layout_width或者layout_height设为0dp,让View没有长度。...layout_constraintHeight_percent:高度百分比,占父类高度的百分比 layout_constraintWidth_percent:宽度百分比,占父类宽度的百分比 假设一下场景...锚点是parent(也就是屏幕),因为分辨率不一样,使用百分比的view占的位置、大小肯定是不相同的,720的50%等于360,而1080的50%是等于590,仅仅是看起来位置相同,实际并不相同,所以百分比与固定大小结合实现布局

    5.7K10

    Jetpack--LifeCycle、ViewModel、LiveData

    Jetpack是google官方的开发工具集,目的是为了标准化和加快开发效率,并且之后会持续更新 开发中,google推荐使用MVVM架构,Jetpack集成了构建MVVM架构的几种工具,相比于以前的...可以说你的项目没有升级使用这套架构,那么你的架构就已经过时了 JetPack与AndroidX AndroidX命名空间中包含Jetpack库 AndroidX代替Android Support Library...AAC(Android Architect Component)中的组件并入AndroidX 其他一些需要频繁更新和迭代的特性也并入AndroidX 一、LifeCycle LifeCycle会自动绑定组件的生命周期...ViewModel还具有异步调用不会造成内存泄漏的优点,需要结合LiveData使用,ViewModel的生命周期是独立于Activity的 三、LiveData LiveData对象提供了可观测方法,数据发送改变...,观测方能够观测到,并且线程安全,集成了LifeCycle的绑定生命周期特性 1.来实现一个定时器,线程中更新定时时间,使用LiveData使得ui上进行更新 布局文件很简单,一个TextView <?

    1.7K20

    炫酷!MotionLayout 使用介绍 (第一章)

    MotionLayout  是ConstrainLayout 2.0库中被引入的一个新类,帮助开发者关联手势和组件动画。接下来的文章将介绍会如何在应用中添加和使用MotionLayout。...系统框架中已经提供下面几种方法在应用中使用动画: 动画矢量Drawable 属性动画框架 LayoutTransition动画 使用TransitionManager进行布局转换 CoordinatorLayout...[strip] 最后,作为ConstrainLayout 2.0的一部分,它最低支持API 14,99.8%的设备都可以使用。...限制 不同于TransitionManager,MotionLayout只能用于他的直接组件。...何时使用MotionLayout 我们设想到的使用MotionLayout的使用场景:当你需要移动,缩放或者动画实际的UI组件(按钮,标题栏等)来提供与用户的互动

    4.2K00

    Android Notes|细数「八大布局」那些事儿

    当前 View 边距 Margins 目标 View 的可见性为 View.GONE ,还可以使用以下属性设置当前 View 在前者 GONE 情况下的 margin。...属性 作用 layout_goneMarginStart 目标 View 隐藏,当前 View 距离左侧间距 layout_goneMarginEnd 目标 View 隐藏,当前 View 距离右侧间距...目标 View 隐藏,当前 View 距离右侧间距 layout_goneMarginBottom 目标 View 隐藏,当前 View 距离底部间距 如下效果: [41d24ef1e10048f6b98821477423984d...android:maxHeight 设置布局的最大高度 ConstraintLayout 内部 View 宽度/高度为 0dp,则同等于 match_parent。...使用这块需要注意: 设置宽度/高度百分比,需要先将对应的宽/高设置为 0dp; 默认值应设置为百分比 app:layout_constraintWidth_default="percent" 或 app

    1.8K00

    【翻译】MotionLayout实现折叠工具栏(Part 1)

    MotionLayout 和上许多其他的动画框架的一个主要不同点在于:视图动画和属性动画运行的时长是给定的,比如指定动画的时长,取消某个动画都是可行的,但是不能做到用户控制一个正在进行中的动画。...让我们首先看看这两个状态下图片 ImageView 的高度差。...以 CustomAttribute 为名暗示着我们正在使用一个自定义视图 View ,但实际上并不是这样。...我们使用的是一个标准的 ImageView 控件,其位于 ConstraintSet 下的 Constraint 元素中,其主要的属性变成可以是 ConstraintLayout.LayoutParams...当然,你也可以使用自定义视图上的自定义属性来实现,就如同 ObjectAnimator 一样。 另外 TextView 实际上也非常类似。

    1.9K31

    项目需求讨论 — ConstraintLayout 详细使用教程

    所以按钮无法紧靠着左边的或者右边的其中一个边界,所以这时候,这个按钮就会居于二个约束边界的中间位置。如下图所示: ?...进行限制: 您可以为ConstraintLayout本身定义最小和最大尺寸: android:minWidth设置布局的最小宽度 android:minHeight设置布局的最小高度 android:maxWidth...设置布局的最大宽度 android:maxHeight设置布局的最大高度 复制代码 这些最小和最大尺寸将在ConstraintLayout使用 2.对内部的控件进行限制: 可以通过以3种不同方式设置android...某个控件要越过自己的时候,Barrier会自动移动,避免自己被覆盖。 关于这个控件其他文章有详细的介绍,我直接附上地址: ConstraintLayout之Barrier。...指引可以是水平的也可以是垂直的: 垂直指南的宽度为零,它们的ConstraintLayout父项的高度为零 水平指南的高度为零,其ConstraintLayout父项的宽度为零 定位准则有三种不同的方式

    1.6K20
    领券