如何在片段中而不是在活动中使用 NavController(在片段中带有 NavHost)?

Posted

技术标签:

【中文标题】如何在片段中而不是在活动中使用 NavController(在片段中带有 NavHost)?【英文标题】:How to use NavController (with a NavHost in a fragment) in a fragment rather than in an activity? 【发布时间】:2019-06-17 19:09:19 【问题描述】:

我有一个 MainActivity,其中我有一个带有 mainFragment 的 navController,用作 4 个片段(Feed、Notifications、Profile 和 Help)的 NavHost。我的问题是这些片段中的第三个,我需要它还有自己的 navController 和 3 个选项(活动、成就和编辑配置文件)。我尝试创建与我在 MainActivity 中创建的相同的方式,在 Profile 片段中使用 NavHost 的片段,但 android 不接受这种方式,我在 Google 上找不到任何示例。有人知道怎么解决吗?

https://developer.android.com/reference/kotlin/androidx/navigation/NavController

它遵循我在MainActivity中实现的方式,这个“bottomNavigationView”是在片段之间传递的菜单:

        navController = Navigation.findNavController(this, R.id.main_fragment);

        navController.addOnDestinationChangedListener((controller, destination, arguments) -> 
        navDestination = destination;

        switch (destination.getId()) 

            case R.id.feed:
                bottomNavigationView.setCurrentActiveItem(0);
                break;
            case R.id.alerts:
                bottomNavigationView.setCurrentActiveItem(1);
                break;
            case R.id.profile:
                bottomNavigationView.setCurrentActiveItem(2);
                break;
            case R.id.help:
                bottomNavigationView.setCurrentActiveItem(3);
                break;

        

    );
    bottomNavigationView.setNavigationChangeListener((view, position) -> 

        switch (position) 
            case 0:
                if (navDestination.getId() != R.id.feed) 
                    titleHeaderMain.setText(R.string.publicacao);
                    titleHeaderMain.setGravity(View.TEXT_ALIGNMENT_CENTER);
                    navController.navigate(R.id.feed);
                
                break;
            case 1:
                if (navDestination.getId() != R.id.alerts) 
                    titleHeaderMain.setText(R.string.notificacoes);
                    navController.navigate(R.id.alerts);
                
                break;
            case 2:
                if (navDestination.getId() != R.id.profile) 
                    titleHeaderMain.setText(R.string.perfil);
                    navController.navigate(R.id.profile);
                
                break;
            case 3:
                if (navDestination.getId() != R.id.help) 
                    titleHeaderMain.setText(R.string.ajudar);
                    navController.navigate(R.id.help);
                
                break;
        

    );

【问题讨论】:

那么您到底遇到了什么问题?您能否指出您遇到问题的线路以及错误消息是什么?您当然可以像任何其他 Fragment 一样将 NavHostFragment 嵌套在 Fragment 中作为子 Fragment。 【参考方案1】:

您必须重新考虑您的导航路径。我有同样的问题,但它没有用。我不得不对其进行返工。

我只将底部导航放在活动中,并根据目的地隐藏或显示它。

【讨论】:

请详细说明。为什么 OP 必须重新考虑他的导航以及您究竟是如何解决这个问题的。请举个例子。

以上是关于如何在片段中而不是在活动中使用 NavController(在片段中带有 NavHost)?的主要内容,如果未能解决你的问题,请参考以下文章

在模拟器中而不是在设备中更新位置

使用 jQuery 在变量中而不是在当前 DOM 中选择内容?

片段中的recyclerview的“RecyclerView:没有附加适配器;跳过布局”[重复]

我想在详细信息页面中而不是在 AspNetCore Web 应用程序的索引页面中构建列

查询在一个环境中而不是在其他环境中并行运行

DLL 在子文件夹中而不是在应用程序文件夹中