Kotlin中点击按钮从Fragment跳转Activity 运行崩溃如何解决
问题原因排查
- 你使用了已废弃的Kotlin Android Extensions(
kotlinx.android.synthetic语法)来获取布局控件,在onCreateView生命周期中,Fragment 还未完成视图绑定,直接调用btn_log_out会触发空指针异常,导致应用崩溃。 - 你当前是在填充布局后直接调用控件设置点击事件,此时控件还未关联到当前Fragment的视图,所以获取不到控件实例。
修复方案
方案1:适配原有synthetic语法的快速修复
把点击事件的设置逻辑移到 onViewCreated 生命周期方法中,该方法会在视图创建完成后调用,此时synthetic可以正常获取到控件:
package com.gearsrun.www.UI.Home.fragment import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.gearsrun.www.R import com.gearsrun.www.UI.Sunflower.SunflowerAvailableActivity import kotlinx.android.synthetic.main.fragment_profile.* class ProfileFragment : Fragment() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { // 仅做布局填充 return inflater.inflate(R.layout.fragment_profile, container, false) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) // 视图创建完成后再设置点击事件 btn_log_out.setOnClickListener { activity?.let { val intent = Intent(it, SunflowerAvailableActivity::class.java) it.startActivity(intent) } } } }
方案2:官方推荐的稳定写法(避免空指针问题)
Kotlin Android Extensions已经被官方废弃,推荐使用View Binding实现控件获取,先在模块级build.gradle中开启View Binding功能:
android { ... buildFeatures { viewBinding true } }
再修改Fragment代码:
package com.gearsrun.www.UI.Home.fragment import android.content.Intent import android.os.Bundle import androidx.fragment.app.Fragment import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import com.gearsrun.www.R import com.gearsrun.www.UI.Sunflower.SunflowerAvailableActivity import com.gearsrun.www.databinding.FragmentProfileBinding class ProfileFragment : Fragment() { private var _binding: FragmentProfileBinding? = null private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = FragmentProfileBinding.inflate(inflater, container, false) return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) binding.btnLogOut.setOnClickListener { activity?.let { startActivity(Intent(it, SunflowerAvailableActivity::class.java)) } } } override fun onDestroyView() { super.onDestroyView() // 销毁视图时清空绑定实例,避免内存泄漏 _binding = null } }
额外注意事项
请确认你要跳转的SunflowerAvailableActivity已经在AndroidManifest.xml中完成注册,未注册的Activity也会导致跳转时应用崩溃。
内容的提问来源于stack exchange,提问作者Yellow Clock
相关产品推荐
相关产品推荐

