Как выполнить нижнюю навигацию в Android с использованием загруженных модулей Dynami c со вторым графом навигации - PullRequest
1 голос
/ 30 мая 2020

Я пытаюсь использовать компонент навигации с модулями функций 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"

Код отмечает домашний экран / фрагмент :

  1. Добавлен второй граф навигации, который использует тег <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)
        }
    }
}



1 Ответ

0 голосов
/ 02 сентября 2020

Ответ, который я реализовал, немного длинноват и требует, чтобы вы использовали NavigationExtensions от Google. Вы можете проверить эту ссылку для ответа. Также он содержит ссылку на рабочий образец в github.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...