Я пытаюсь использовать компонент навигации с модулями функций c Dynami для приложения, которое я сейчас работаю. Недавно я настроил основной навигационный график для загрузки навигации между приветствием и домашним экраном.
При рендеринге домашнего экрана (как определено в основном навигационном графике) фрагменты в динамике c функциональные модули динамически загружаются и отображаются в макете с помощью BottomNavigationView, но в качестве включенного навигационного графа назначения / действия внутри включенных навигационных графов не выполняются и не распознаются в NavController в HomeFragment.
Мой вопрос: : Как я могу успешно загрузить график навигации модулей функций Dynami c на главном экране, чтобы обеспечить поток навигации для включенных модулей в приложение при установке?
Говоря «обеспечение потока навигации для включенных модулей», я имею в виду тот факт, что включенные навигационные графы и их пункты назначения должны работать так же, как обычная настройка навигации, как при использовании одного навигационного графа.
Для e xample, я выбрал 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"
Код отмечает домашний экран / фрагмент :
- Добавлен второй граф навигации, который использует тег
<include-dynamic... />
для загрузки модулей функций c Dynami.
[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>
Сконфигурировал файл меню xml для виджета BottomNavigationView в макете Home Fragment, позже, в макете, я добавил приложение: меню и ссылку на график в FragmentContainerView.
[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 я сделал настройку для потока навигации для BottomNavigationView, используя второй граф навигации.
[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)
}
}
}