Android属性变更后Binding Adapter未触发更新的问题求助
解决方案
第一步:简化ViewModel代码
无需实现Observable接口、也不需要添加@Bindable注解,直接保留LiveData即可:
class MainActivityViewModel : ViewModel() { val drawableResource = MutableLiveData<Int>() init { drawableResource.value = R.drawable.dice_1 } fun onRollButtonClicked(){ drawableResource.value = when(Random.nextInt(1,7)){ 1 -> R.drawable.dice_1 2 -> R.drawable.dice_2 3 -> R.drawable.dice_3 4 -> R.drawable.dice_4 5 -> R.drawable.dice_5 else -> R.drawable.dice_6 } } }
第二步:给DataBinding绑定LifecycleOwner
在MainActivity初始化Binding的逻辑中添加LifecycleOwner配置,DataBinding会自动感知LiveData的变化,不需要手动实现观察逻辑:
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding private lateinit var viewModel: MainActivityViewModel override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) viewModel = ViewModelProvider(this)[MainActivityViewModel::class.java] // 关键配置:让Binding绑定当前页面的生命周期,自动处理LiveData的订阅 binding.lifecycleOwner = this binding.viewModel = viewModel } }
第三步:BindingAdapter优化(可选)
你现有的BindingAdapter已经可以正常工作,可优化参数类型避免强转:
@BindingAdapter("android:imageRes") fun loadImage(imageView: ImageView, imageRes: Int){ imageView.setImageResource(imageRes) }
如果不需要自定义逻辑,也可以直接在XML中用原生属性android:src="@{viewModel.drawableResource}",DataBinding原生支持给src绑定资源ID。
原代码问题说明
- LiveData和BaseObservable是DataBinding的两套独立绑定方案,用LiveData时不需要实现Observable接口和相关回调方法
- 不需要在BindingAdapter中手动观察LiveData,配置LifecycleOwner后,DataBinding框架会自动完成LiveData的订阅、值解析和更新分发。
内容的提问来源于stack exchange,提问作者JProgrammer
相关产品推荐
相关产品推荐

