如何获取NavHostFragment

问题描述 投票:0回答:6

我正在将 Android 的导航架构组件集成到我的应用程序中。我在将数据从活动传递到片段的开头时遇到了一些问题,因此我遵循了这个答案:导航架构组件-将参数数据传递到 startDestination

这个逻辑对我来说似乎是合理的,但我正在努力确定如何实际获取 NavHostFragment。埃利奥特·施罗克(Elliot Shrock)用过这句话 -

val navHostFragment = navFragment as NavHostFragment

但我还没有找到有效的 Java 等效项。 我尝试使用以下方式获取我的 navHost 的片段

getSupportFragmentManager().findFragmentById(R.id.[mynavhostid])

但是这个命令返回 null。有什么想法吗?

android android-fragments android-architecture-components fragmentmanager android-architecture-navigation
6个回答
5
投票

我通过首先膨胀包含 NavHost 的视图,然后使用 supportFragmentManager 获取 navHost Fragment 并传入我的默认参数来解决这个问题。

希望 Google 的 Android 团队将来能为此提供更干净的解决方案。


2
投票

这东西对我有用

 val navHostFragment = nav_host_fragment as NavHostFragment

1
投票

注意,由于某种原因,调试器有时会为 NavHostFragment 返回 null,而代码实际上可以毫无问题地找到它。我不知道为什么,但它大概占用了我 3 个小时的时间,通过打印或使用片段来确保它实际上为空!


0
投票

实际上,请验证 XML 中的 NavHostFragement ID 是否与您在代码中引用的 ID 匹配。


0
投票

因此,尝试使用

NavController
检索 Activity 的
onCreate()
中的
Navigation.findNavController(Activity, @IdRes int)
将失败。您必须直接从支持片段管理器检索它。首先,确保您的活动延长
AppCompatActivity
。否则,您将无法使用
getSupportFragmentManager()
。然后,这段代码应该可以工作:

NavHostFragment navHostFragment =
                    (NavHostFragment) getSupportFragmentManager().findFragmentById(R.id.nav_host_fragment);
NavController navController = navHostFragment.getNavController();

进一步阅读:https://developer.android.com/guide/navigation/navigation-getting-started


0
投票

如果您想通过 Fragment 膨胀 NavHost,请在应用程序中使用此代码。

btnClick.setOnClickListener(view -> {
          NavHostFragment.findNavController(getParentFragment())
                .navigate(R.id.activity_login_to_homeFragment); 
       }

此代码 ID 必须与 NAVIGATION.XML 文件附件相同。

© www.soinside.com 2019 - 2024. All rights reserved.