如何获得活动内的navController ?



我使用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();

如果您使用FragmentContainerViewViewBinding,这里有一个更简洁的方法:

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"
/>

相关内容

  • 没有找到相关文章

最新更新