如何获取NavHostFragment

9
我正在将Android的导航架构组件集成到我的应用程序中。我在从活动传递数据到片段的开头遇到了一些问题,因此我正在遵循这个答案:Navigation Architecture Component- Passing argument data to the startDestination
这个逻辑对我来说似乎是有道理的,但我很难确定如何实际获取NavHostFragment。Elliot Shrock使用了这一行 - val navHostFragment = navFragment as NavHostFragment 但我没有找到一个可行的Java等效方法。 我尝试通过使用以下代码获取我的navHost的片段 getSupportFragmentManager().findFragmentById(R.id.[mynavhostid]) 但是该命令返回null。有任何想法吗?

val navHostFragment = navFragment as NavHostFragment is the equivalent of NavHostFragment navHostFragment = (NavHostFragment) findViewById(R.id.navFragment) - Diego Malone
6个回答

5
我通过先膨胀包含NavHost的视图,然后使用supportFragmentManager获取navHost片段并传入我的默认参数来解决了这个问题。
希望Google的Android团队将来能提供更清晰的解决方案。

2
最初的回答适用于我。
 val navHostFragment = nav_host_fragment as NavHostFragment

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

enter image description here


0

如果你想通过 Fragment 来扩充 NavHost,请在应用中使用以下代码。

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

在这段代码中,ID 必须与 NAVIGATION.XML 文件附件相同。

☻♥ 完成。


0

因此,在 Activity 的 onCreate() 中尝试使用 Navigation.findNavController(Activity, @IdRes int) 检索 NavController 将失败。您必须直接从支持片段管理器中检索它。首先,请确保您的 Activity 扩展了 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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接