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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:06:02