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

Navigation Controller按钮点击无法切换Fragment问题

问题定位

你的Fragment跳转不生效的核心原因是firstFragment中的View Binding初始化逻辑完全错误,绑定的点击事件没有关联到实际展示在界面上的视图。
具体错误点:

  • onCreateView方法中你通过inflater.inflate(R.layout.fragment_first, container, false)加载了Fragment的界面视图,但在onViewCreated中又重新调用FragmentFirstBinding.inflate(layoutInflater)生成了一个独立的、从未被挂载到界面上的新视图实例。你给这个无效实例上的按钮绑定点击事件,用户操作实际界面上的按钮时自然不会触发任何逻辑。
  • 代码中读取的age、name变量目前没有做非空校验,输入框为空时调用toInt()会直接触发崩溃,且你还没有在导航配置中给目标Fragment设置对应的参数,这两个问题不影响当前跳转,但后续运行会出问题。
修复代码

直接替换firstFragment.kt的全部逻辑即可:

package com.example.testingnavigationcomponent

import android.os.Bundle
import androidx.fragment.app.Fragment
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.navigation.fragment.findNavController
import com.example.testingnavigationcomponent.databinding.FragmentFirstBinding

class firstFragment : Fragment() {

    private var _binding: FragmentFirstBinding? = null
    private val binding get() = _binding!!

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        _binding = FragmentFirstBinding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(savedInstanceState)
        binding.btnAccept.setOnClickListener {
            val age = binding.etEnterAge.text.toString().toIntOrNull() ?: 0
            val name = binding.etEditName.text.toString()
            val action = firstFragmentDirections.actionFirstFragmentToSecondFragment()
            findNavController().navigate(action)
        }
    }

    override fun onDestroyView() {
        super.onDestroyView()
        _binding = null
    }
}
其他优化建议
  • 类名遵循Kotlin大驼峰命名规范,将firstFragment重命名为FirstFragment、secondFragment重命名为SecondFragment,重命名后同步修改test_nav.xml中两个Fragment节点的android:name属性对应完整类名,避免运行时类找不到崩溃。
  • 如果需要把age、name参数传递给SecondFragment,需要先在test_nav.xml的secondFragment节点下添加对应的<argument>配置,再在构建action时传入参数,否则SafeArgs不会生成带参的跳转方法。
  • 你MainActivity和activity_main.xml、导航图test_nav.xml的配置没有问题,不需要修改。

内容的提问来源于stack exchange,提问作者Kafka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 07:30:50