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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 11:45:03