Android应用切换语言时RadioGroup空指针异常问题求助
报错信息:
NullPointerException: Attempt to invoke virtual method 'void android.widget.RadioGroup.setOnCheckedChangeListener(android.widget.RadioGroup$OnCheckedChangeListener)' on a null object reference
排查方向
- 优先确认RadioGroup的查找路径是否正确:90%以上的该类错误都是因为要获取的RadioGroup在弹窗布局内,却直接用Activity的
findViewById查找,此时Activity的内容布局中没有对应ID的控件,自然返回空值。必须先加载弹窗布局,再从弹窗布局实例中查找控件:
正确示例:// 先加载弹窗专属布局 View dialogView = LayoutInflater.from(ArtistActivity.this).inflate(R.layout.你的弹窗布局文件名, null); // 从弹窗布局中查找RadioGroup RadioGroup langRadioGroup = dialogView.findViewById(R.id.你布局里的RadioGroupID); // 此时再设置监听不会触发空指针 langRadioGroup.setOnCheckedChangeListener((group, checkedId) -> { // 处理语言切换逻辑 }); // 最后将布局设置给弹窗 new AlertDialog.Builder(ArtistActivity.this) .setView(dialogView) .show(); - 检查ID拼写与包引入是否正确:确认Java文件中引用的RadioGroup ID和XML布局中定义的ID完全一致,没有拼写错误、大小写错误;同时检查头部导入的R包是否为当前应用的包名R类,而非系统的
android.R。 - 确认初始化顺序没有颠倒:
setOnCheckedChangeListener调用必须在findViewById之后,禁止在控件完成初始化前调用监听设置方法。 - Kotlin开发额外检查:如果使用Kotlin开发,不要直接通过全局合成属性(synthetic)访问弹窗内控件,必须从inflate得到的布局实例中获取,或使用ViewBinding绑定弹窗布局后再访问控件;同时检查
lateinit声明的控件是否在赋值前就被调用。
内容的提问来源于stack exchange,提问作者Nicolas Zanforlini
相关产品推荐
相关产品推荐

