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
相关产品推荐
相关产品推荐

