使用Data Binding开发摄氏华氏度转换器出现ActivityMainBindingImpl报错
修复方案
一、解决自动生成Binding类的编译错误
你碰到的三个自动生成文件报错,都是Data Binding缓存冲突+Activity初始化逻辑错误导致的,按以下步骤操作即可修复:
- 清理旧编译缓存:点击Android Studio顶部菜单栏
Build -> Clean Project,再执行Build -> Rebuild Project,删除错误的临时生成文件。 - 修正MainActivity的初始化逻辑:你在
onCreate中重复调用了两次setContentView,还混用了findViewById和Data Binding,直接删除冗余代码即可,修改后的onCreate代码如下:
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivityMainBinding.inflate(getLayoutInflater()); binding.setLifecycleOwner(this); setContentView(binding.getRoot()); viewModel = new ViewModelProvider(this).get(MainViewModel.class); binding.setViewModel(viewModel); // 通过binding直接获取输入框实例,不需要手动findViewById inputTemperature = binding.inputTemperatura; // 后面补充按钮点击逻辑 }
- 确认模块级
build.gradle中已经开启Data Binding,配置如下,修改后同步项目即可:
android { // 其他配置保持不变 buildFeatures { dataBinding true } }
完成上述操作后重新编译,三个自动生成类的报错就会消失。
二、修复业务逻辑错误
1. 修复ViewModel的非法引用问题
绝对不能在ViewModel中直接new Activity实例,会导致内存泄漏和空指针崩溃,先删除ViewModel里的MainActivity temperaturaInserita = new MainActivity();代码,再修改温度转换方法,让它接收外部传入的输入值:
public int convertiTemperatura(int inputTemp) { if (isCelsius) { grades = (int) ((inputTemp * 1.8) + 32); } else { grades = (int) ((inputTemp - 32) * 0.5556); } return grades; }
2. 补充按钮点击逻辑
在MainActivity的onCreate末尾添加两个按钮的点击事件,触发转换和单位切换逻辑:
// 切换温度单位 binding.cambiaTemperatura.setOnClickListener(v -> { viewModel.changeTypeTemperature(); binding.textView.setText(viewModel.getTypeCurrentTemperature()); }); // 执行温度转换 binding.converti.setOnClickListener(v -> { String inputStr = inputTemperature.getText().toString().trim(); // 空输入校验,避免崩溃 if (inputStr.isEmpty()) { inputTemperature.setError("请输入温度值"); return; } int inputTemp = Integer.parseInt(inputStr); int result = viewModel.convertiTemperatura(inputTemp); binding.textTemperatura.setText(String.valueOf(result)); });
3. 修正输入框取值错误
你之前写的inputTemperature.toString()取的是控件对象的字符串标识,不是用户输入的内容,需要改成inputTemperature.getText().toString(),上面的点击逻辑里已经做了修正。
4. 删除布局中的无效绑定
删掉textView和textTemperatura控件里的@{viewModel.xxx}绑定表达式,改成通过点击事件主动更新内容,避免初始化时调用方法拿空值崩溃。
完成上述所有修改后,重新编译运行即可正常使用。
内容的提问来源于stack exchange,提问作者Francesco Zanoncelli
相关产品推荐
相关产品推荐

