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
相关产品推荐
相关产品推荐

