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

Android使用DataBinding控制ProgressBar可见性无法正常隐藏问题求助

问题原因

你遇到的现象是MotionLayout的特性导致的:MotionLayout会接管所有子View的属性状态,当场景过渡执行完成、布局触发重绘时,会自动恢复你在MotionScene中定义的子View初始属性,你通过DataBinding设置的GONE属性会被直接覆盖,就会出现ProgressBar消失一秒后重新显示的情况。

可行解决方案

  • 方案1:在你用到的MotionScene对应的ConstraintSet节点中,给ProgressBar添加app:applyVisibility="false"属性,告知MotionLayout不要接管该View的可见性控制,DataBinding的绑定逻辑就可以正常生效。
  • 方案2:调整布局结构,用FrameLayout作为根布局,把ProgressBar移到MotionLayout外层,这样ProgressBar不归MotionLayout管理,原有绑定逻辑无需修改即可正常运行。
  • 方案3:若不希望调整布局结构,可放弃直接在XML绑定可见性,改为在代码中监听signInProgress的变化,设置可见性的同时同步修改MotionScene中的配置,示例代码如下:
viewModel.signInProgress.observe(viewLifecycleOwner) { isShow ->
    val visibility = if (isShow) View.VISIBLE else View.GONE
    // 先修改MotionScene中的配置,避免被重置
    val constraintSet = binding.motionLayout.getConstraintSet(R.id.your_current_constraint_set_id)
    constraintSet.setVisibility(R.id.login_progress, visibility)
    // 再设置View的可见性
    binding.loginProgress.visibility = visibility
}

补充排查项

如果修改后问题依然存在,可以给signInProgress添加监听打日志,确认是否有其他业务逻辑(比如接口回调、异常重试逻辑)意外将值改回了true,排除业务代码的问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 03:27:04