You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

代码创建的自定义Shape位置设置不生效,如何获取View加载完成回调?

问题根因

你在onViewCreated中设置x/y坐标时,父布局RelativeLayout还未完成测量、布局流程,此时自定义ViewCube的自身尺寸、父布局的可用区域都未最终确定,你手动设置的坐标会被后续系统触发的布局逻辑覆盖,因此无法生效。放在onDraw中生效的原因是onDraw执行在布局流程结束之后,此时坐标不会再被系统重置,但重复在绘制流程中设置坐标会造成不必要的性能消耗。

解决方案
  • 方案1:使用View的post方法(最简实现)
    post提交的任务会被加入视图消息队列,等当前View完成测量、布局流程后自动执行,无需额外监听移除逻辑:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val layout = view.findViewById<RelativeLayout>(R.id.firstFragment)

    val cube = Cube(view.context)
    layout?.addView(cube)
    // 布局完成后再设置坐标
    cube.post {
        cube.x = 0F
        cube.y = 0F
    }
}
  • 方案2:使用OnGlobalLayoutListener监听布局完成事件
    适合需要更精确控制布局时机的场景,注意用完要移除监听器避免内存泄漏:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val layout = view.findViewById<RelativeLayout>(R.id.firstFragment)

    val cube = Cube(view.context)
    layout?.addView(cube)
    
    cube.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
        override fun onGlobalLayout() {
            cube.x = 0F
            cube.y = 0F
            // 执行完成后立即移除监听器
            cube.viewTreeObserver.removeOnGlobalLayoutListener(this)
        }
    })
}
  • 方案3:通过布局参数设置位置(推荐)
    遵循Android原生布局机制,直接给Cube设置RelativeLayout的布局规则,无需手动修改坐标,稳定性更高:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    val layout = view.findViewById<RelativeLayout>(R.id.firstFragment)

    val cube = Cube(view.context)
    // 按实际需求设置宽高,也可替换为WRAP_CONTENT/MATCH_PARENT
    val params = RelativeLayout.LayoutParams(200.dpToPx(), 200.dpToPx())
    // 设置贴父布局左上角的规则
    params.addRule(RelativeLayout.ALIGN_PARENT_TOP)
    params.addRule(RelativeLayout.ALIGN_PARENT_LEFT)
    cube.layoutParams = params
    
    layout?.addView(cube)
}

内容的提问来源于stack exchange,提问作者sgch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 01:39:04