ViewBinding使用不当致Activity数据传递失败,应用中断求助
Android ViewBinding 修复:Activity间数据传递崩溃问题
核心错误分析
- 生命周期调用顺序错误:
super.onCreate(savedInstanceState)必须是onCreate方法的第一行代码,否则会破坏Activity初始化流程。 - 重复设置布局:先通过
setContentView(binding.root)加载ViewBinding布局,又调用setContentView(R.layout.activity_main)覆盖,导致ViewBinding绑定的视图完全失效。 - 控件引用方式错误:
aktiviteDegistir方法中直接使用editText,未通过binding.editText获取,触发空指针异常。 - 第二个Activity代码逻辑位置错误:控件操作代码直接写在类作用域,未放在
onCreate方法内,且未初始化TextView。
修复后的完整代码
MainActivity.kt
class MainActivity : AppCompatActivity() { private var _binding: ActivityMainBinding? = null private val binding get() = _binding!! override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 必须放在最开头 _binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) // 仅设置一次布局 } fun aktiviteDegistir(view: View) { // 通过binding获取EditText内容 val kullaniciVerisi = binding.editText.text.toString() val intent = Intent(this, IkinciActivity::class.java) intent.putExtra("yollananVeri", kullaniciVerisi) startActivity(intent) } override fun onDestroy() { super.onDestroy() _binding = null // 销毁时释放Binding,避免内存泄漏 } }
IkinciActivity.kt
class IkinciActivity : AppCompatActivity() { private var _binding: ActivityIkinciBinding? = null private val binding get() = _binding!! override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) _binding = ActivityIkinciBinding.inflate(layoutInflater) setContentView(binding.root) // 在onCreate内处理数据接收和TextView赋值 val alinanVeri = intent.getStringExtra("yollananVeri") binding.textView2.text = alinanVeri ?: "未接收到数据" // 空值处理,避免崩溃 } override fun onDestroy() { super.onDestroy() _binding = null } }
额外注意事项
- 确保已在项目Module级别的
build.gradle中启用ViewBinding:
android { ... buildFeatures { viewBinding true } }
- 布局文件中EditText的id必须为
editText,第二个Activity的TextView id必须为textView2,否则ViewBinding类会生成对应不同的属性名。 - 添加空值判断(
?: "未接收到数据"),避免当传递数据为空时TextView赋值崩溃。
内容的提问来源于stack exchange,提问作者Gencay Deniz
相关产品推荐
相关产品推荐

