ConstraintLayout内嵌fragment的View Binding无法识别如何解决
问题原因
View Binding 不支持直接绑定布局中声明的 <fragment> 标签控件,该场景是View Binding的设计限制:
生成绑定类时,仅会为布局内继承自View的组件生成对应属性,<fragment>标签不属于标准View子类,因此不会生成对应的binding.navHostFragment属性,换成其他视图组件能正常工作也符合该规则。
解决方案
方案1:使用FragmentManager查找NavHostFragment(无需修改布局)
直接通过系统提供的Fragment管理器获取指定ID的NavHostFragment实例即可,修改对应代码如下:
override fun onOptionsItemSelected(item: MenuItem): Boolean { when (item.itemId) { android.R.id.home -> { val navHostFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment navHostFragment.navController.popBackStack() return true } } return super.onOptionsItemSelected(item) }
方案2:替换为FragmentContainerView(兼容View Binding)
AndroidX 推荐使用FragmentContainerView作为fragment的容器组件,该组件继承自View,可以被View Binding正常识别,将布局中的<fragment>标签替换为以下内容:
<androidx.fragment.app.FragmentContainerView android:id="@+id/nav_host_fragment" android:name="androidx.navigation.fragment.NavHostFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:defaultNavHost="true" app:navGraph="@navigation/nav_graph" />
替换后可通过binding.navHostFragment拿到容器实例,再配合FragmentManager获取内部的NavHostFragment即可。
内容的提问来源于stack exchange,提问作者andrepaso
相关产品推荐
相关产品推荐

