当前位置: 首页 > 知识库问答 >
问题:

如何使用带有第二个导航图的动态加载模块在Android中执行底部导航

汝繁
2023-03-14

我正在尝试使用一个应用程序的动态功能模块的导航组件,我目前正在工作。最近,我配置了主导航图,用于加载欢迎屏幕和主屏幕之间的导航。

当呈现主屏幕(如主导航图中定义的)时,动态特征模块中的片段被动态加载并显示在带有BottomNavigationView的布局中,但是,作为包含的导航图,包含的导航图中的目的地/动作不会在HomeFraank的NavController中执行或识别。

我的问题是:我如何在主屏幕中成功加载动态功能模块导航图,以确保安装时应用程序中包含的模块的导航流程?

当说“确保包含模块的导航流程”时,我指的是包含的导航图及其目的地必须与使用单个导航图时的正常导航设置相同。

例如,我在主屏幕底部导航中选择Tab01,当显示时,出现一个包含新闻提要信息的列表,然后在新闻项中单击,它导航到新闻内容片段屏幕。

在这种情况下,显示此错误:

java.lang.IllegalArgumentException: navigation destination action_news_list_to_detail is unknown to this NavController
at androidx.navigation.NavController.navigate(NavController.java:919)
at androidx.navigation.NavController.navigate(NavController.java:859)
at androidx.navigation.NavController.navigate(NavController.java:845)
at androidx.navigation.NavController.navigate(NavController.java:1093)
at org.example.dfm01.Tab01Fragment.handleSelectedItem(Tab01Fragment.kt:72)
at org.example.dfm01.Tab01Fragment.access$handleSelectedDestination(Tab01Fragment.kt:23)
at org.example.dfm01.Tab01Fragment$setupRecyclerView$$inlined$apply$lambda$1.invoke(Tab01Fragment.kt:58)
at org.example.dfm01.Tab01Fragment$setupRecyclerView$$inlined$apply$lambda$1.invoke(Tab01Fragment.kt:23)
at org.example.dfm01.Tab01recyclerAdapter$ViewHolder$bind$$inlined$apply$lambda$1.onClick(Tab01recyclerAdapter.kt:97)
at android.view.View.performClick(View.java:7155)
at android.view.View.performClickInternal(View.java:7124)
at android.view.View.access$3500(View.java:808)
at android.view.View$PerformClick.run(View.java:27370)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:359)
at android.app.ActivityThread.main(ActivityThread.java:7418)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:935)

我使用以下依赖项进行导航:

    api "androidx.navigation:navigation-fragment-ktx:$nav_version"
    api "androidx.navigation:navigation-ui-ktx:$nav_version"
    api "androidx.navigation:navigation-dynamic-features-fragment:$nav_version"

代码注释主屏幕/片段:

  1. 添加了第二个导航图,它使用

[nav_graph_home.xml]

<?xml version="1.0" encoding="UTF-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <include-dynamic
        android:id="@+id/included_nav_01"
        app:graphPackage="org.example.dfm01"
        app:graphResName="nav_tab_01"
        app:moduleName="example_dfm_01" />
    <include-dynamic
        android:id="@+id/included_nav_02"
        app:graphPackage="org.example.dfm02"
        app:graphResName="nav_tab_02"
        app:moduleName="example_dfm_02" />
    <include-dynamic
        android:id="@+id/included_nav_03"
        app:graphPackage="org.example.dfm03"
        app:graphResName="nav_tab_03"
        app:moduleName="example_dfm_03" />
    <include-dynamic
        android:id="@+id/included_nav_04"
        app:graphPackage="org.example.dfm04"
        app:graphResName="nav_tab_04"
        app:moduleName="example_dfm_04" />
</navigation>

[fragment_home.xml]

<?xml version="1.0" encoding="UTF-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
    <androidx.fragment.app.FragmentContainerView
        android:id="@+id/nav_host_fragment_home"
        android:name="androidx.navigation.dynamicfeatures.fragment.DynamicNavHostFragment"
        app:defaultNavHost="true"
        app:navGraph="@navigation/nav_graph_home" />
    <com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/bottom_nav_home"
        app:menu="@menu/menu_home_bottom" />
</androidx.coordinatorlayout.widget.CoordinatorLayout>

[HomeFragment.kt]

class HomeFragment : Fragment(fragment_home) {

    private val viewBinding: FragmentHomeBinding by viewBinding()

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        val innerNavHostFragment =
            childFragmentManager.findFragmentById(R.id.nav_host_fragment_home) as NavHostFragment
        val innerNavController = innerNavHostFragment.navController
        viewBinding.apply {
            NavigationUI.setupWithNavController(bottomNavHome, innerNavController)
        }
    }
}




共有1个答案

白子默
2023-03-14

我实现的答案有点长,需要您使用来自Google的Navigation扩展。您可以查看此链接以获取答案。它还包含指向github中工作示例的链接。

 类似资料:
  • 我有一个关于底部导航栏的奇怪问题,虽然我花了大量时间在它上面,但我无法解决。当我以“推荐”的方式(从许多教程中)使用它时,它就是无法导航。 那么,我所说的“推荐”方式是什么意思呢:我有一个单独的acticity,其中有一个名为“MainActivity”的navHostFragment。这个主要活动有一个XML布局文件,我将底部导航栏放在其中。BottomNavigationBar还有一个XML布

  • 我试图做恢复片段视图状态值(文本视图,... 我的活动。Java语言 ProductFragment。Java语言 在ProductFragment中,我将向文本视图添加值。当我从ReportFragment开始时,视图值将在ProductFragment中清除。

  • 我有3个项目的底部导航视图,我的如下所示: 底部导航视图中带有嵌套navGraph片段的导航工作正常,但是如果我导航到,它在嵌套navGraph之外,并且我单击其他项目/片段,我无法导航到其他片段,我基本上被困在这个屏幕上。 我检查了一下,如果我把

  • 我正在使用谷歌的支持设计库V25.1.0在Android应用程序中实现底部导航栏。有没有什么方法可以添加阴影效果,就像现在的Android原生谷歌照片应用一样?

  • 我在我的项目中实现了Design Support Library 25中的底部导航视图。我在视图中有5个图标。每当选择一个图标时,它都会有一些动画。但当3个或更少的图标未显示任何动画时。我想删除该动画,只需要对图标进行一些颜色更改。我怎样才能做到这一点?做了足够多的谷歌搜索,但找不到解决方案。请帮忙。谢谢

  • 我有一个带有底部导航和框架布局的主要活动。BottomNavigation可以导航到三个不同的片段。但当我按下后退按钮时,我的底部导航上的选中项并没有选中正确的菜单项。我该如何解决这个问题?这已经困扰了我好几天了