我使用Jetpack Navigation在fragments和activity之间导航。我在布局中有一个MainActivity
和一个FragmentContainerView
。我可以轻松地从片段导航到片段/活动。但是,我找不到一种方法如何从一个活动导航到另一个活动/片段与navController
。
例如,从片段FA,我调用navController.navigate()
到活动A。现在,我想从活动A导航到活动B或片段FB。
我已经试过了:
val host = supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = host.navController
但是总是得到这个错误
null cannot be cast to non-null type androidx.navigation.fragment.NavHostFragment
谢谢!
来自导航组件指南的说明
注意:导航组件是为具有多个片段目的地的一个主活动的应用程序设计的。主活动与导航图相关联,并包含一个NavHostFragment,负责根据需要交换目的地。在有多个活动目的地的应用中,每个活动都有自己的导航图。
你不应该使用导航组件从一个活动导航到另一个活动。它是用来交换Fragment容器上的Fragment的。
你可以使用
在activity
中获得navController
val navHostFragment =
supportFragmentManager.findFragmentById(R.id.nav_host_fragment) as NavHostFragment
val navController = navHostFragment.navController
您还必须将android:name="androidx.navigation.fragment.NavHostFragment"
添加到您的片段容器
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>
For java coder;
可以通过这种方式获取NavController实例
NavHostFragment navHostFragment =(NavHostFragment)getSupportFragmentManager()
.findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController();
如果您使用FragmentContainerView
和ViewBinding
,这里有一个更简洁的方法:
YourActivity.kt
class YourActivity : Activity() {
private lateinit var binding: YourActivityBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = YourActivityBinding.inflate(layoutInflater)
setContentView(binding.root)
val navController = (binding.navHostFragment.getFragment<NavHostFragment>())
.findNavController()
}
}
your_activity.xml
<androidx.fragment.app.FragmentContainerView
android:id="@+id/nav_host_fragment"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
/>