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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 09:02:53