Android开发报错:View未设置NavController问题求助
问题原因
- 错误替换导航宿主:MainActivity中通过
frag()函数直接替换了fragmentContainerView(Navigation的NavHostFragment),将导航宿主换成普通Fragment,导致homeFragment脱离导航架构,点击按钮时无法找到绑定的NavController。 - 冗余的NavHost配置:
fragment_home.xml的根FrameLayout错误添加了android:name="androidx.navigation.fragment.NavHostFragment"属性,homeFragment只是导航图中的一个页面,不需要作为导航宿主。
修复步骤
1. 改用Navigation组件处理底部导航
删除自定义的frag()函数和手动替换Fragment的逻辑,让底部导航直接与NavController绑定:
class MainActivity : AppCompatActivity() { lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) supportActionBar?.hide() binding = DataBindingUtil.setContentView(this, R.layout.activity_main) // 获取导航宿主的NavController val navHostFragment = supportFragmentManager.findFragmentById(R.id.fragmentContainerView) as NavHostFragment val navController = navHostFragment.navController // 绑定底部导航与NavController binding.re.setupWithNavController(navController) } }
2. 移除homeFragment布局中的冗余配置
修改fragment_home.xml的根FrameLayout,删除多余的android:name属性:
<FrameLayout android:layout_width="match_parent" android:layout_height="match_parent">
3. 确保导航图配置正确
在navigations.xml中添加所有底部导航对应的Fragment目的地,且ID与底部菜单ID一致(R.id.home、R.id.bag、R.id.person),同时保留homeFragment到CategorymodeFragment的跳转action:
<navigation xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/navigations" app:startDestination="@id/homeFragment"> <fragment android:id="@+id/homeFragment" android:name="com.yourpackage.fragment.homeFragment" android:label="Home"> <action android:id="@+id/action_homeFragment_to_listFragment" app:destination="@id/listFragment" /> </fragment> <fragment android:id="@+id/bagFragment" android:name="com.yourpackage.fragment.bagFragment" android:label="Bag" /> <fragment android:id="@+id/accontFragment" android:name="com.yourpackage.fragment.accontFragment" android:label="Account" /> <fragment android:id="@+id/listFragment" android:name="com.yourpackage.fragment.CategorymodeFragment" android:label="Category"> <argument android:name="senderCategory" app:argType="string" /> </fragment> </navigation>
4. 优化homeFragment的跳转代码
使用Fragment扩展方法findNavController()获取导航控制器,比通过点击View获取更可靠:
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_home, container, false) binding.digital.setOnClickListener { findNavController().navigate( homeFragmentDirections.actionHomeFragmentToListFragment() .setSenderCategory("electronics") ) } return binding.root }
内容的提问来源于stack exchange,提问作者Omid Rikazadeh
相关产品推荐
相关产品推荐

