使用数据绑定时无法隐藏ProgressBar的问题求助
解决DataBinding下ProgressBar无法隐藏的问题
兄弟,我太懂这种踩坑的感觉了!当你用了DataBinding之后,直接findViewById改View属性经常会被数据绑定的自动更新给“覆盖”掉,这就是你为啥试了View.GONE、换线程都没用的原因。下面给你几个靠谱的解决方案:
方案一:用DataBinding直接控制Visibility(推荐)
既然用了DataBinding,就彻底用它来管理UI状态,别再混用findViewById了。- 先在你的ViewModel或者数据模型里加一个可观察的状态字段,比如:
public class YourViewModel extends ViewModel { public final ObservableBoolean isLoading = new ObservableBoolean(true); // ... 其他业务逻辑 } - 然后在布局里把ProgressBar的visibility绑定到这个字段:
<ProgressBar android:id="@+id/userStatuses_spinner" style="?android:attr/progressBarStyle" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:paddingTop="80dp" android:visibility="@{viewModel.isLoading ? View.VISIBLE : View.GONE}" /> - 当列表加载完成后,只需要更新这个字段就行,DataBinding会自动帮你刷新UI:
viewModel.isLoading.set(false);
- 先在你的ViewModel或者数据模型里加一个可观察的状态字段,比如:
方案二:如果一定要用手动设置的方式
如果你暂时不想改架构,那得通过DataBinding的对象来操作View,并且强制绑定执行完所有待处理的更新:// 假设你已经初始化了DataBinding对象 ActivityYourBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_your); // 直接通过binding获取ProgressBar,而非findViewById binding.userStatusesSpinner.setVisibility(View.GONE); // 强制执行所有待处理的绑定操作,避免你的修改被后续绑定更新覆盖 binding.executePendingBindings();排查点:检查是否有其他绑定逻辑在干扰
别忘了看看你的代码里有没有其他地方(比如LiveData观察者、Observable回调)在修改这个ProgressBar的visibility,要是有,那你手动设置的肯定会被覆盖掉。
为啥之前的方法没用?因为DataBinding会在Activity生命周期的关键节点(比如onStart、onResume)或者数据变化时,自动根据绑定规则更新UI属性。你手动用findViewById改完,后面绑定一更新,又给你改回去了,所以必须顺着DataBinding的规则来~
内容的提问来源于stack exchange,提问作者emericw
相关产品推荐
相关产品推荐

