Как использовать NavHostFragment с ViewPager

Итак, я уже прочитал большую часть https://developer.android.com/guide/navigation/navigation-multi-module#groovy и довольно понимаю, как реализовать и все такое. Но у меня есть довольно сложный вариант использования, и у меня нет конкретного представления о том, как его реализовать.

В моем приложении у меня будет структура, которая выглядит следующим образом:

      Module 1-
    |-Module1_Frag1
        |-Module1_Frag1_SubFrag1
            |-Module1_Frag1_SubSubFrag1
    |...
    |...
Module 2-
    |-Module2_Frag1
        |-Module2_ViewPager1
            |-Module2_Frag1_SubFrag1
                |-Module2_Frag1_SubFrag1_SubFrag1
            |-Module2_Frag1_SubFrag2
                |-Module1_Frag1_SubFrag2_SubFrag1

Я планирую использоватьDrawerLayout, отсюда и структура. Я знаюModule 1это легко сделать, но я не знаю, что с этим делатьModule 2. Как мне структурироватьnav_graphдля этого? Нужно ли мне несколькоNavHostFragmentдля этого?

1 ответ

Я нашел идеи в шаблоне «Действия в представлениях навигационного ящика». По сути, я просто скопировал то, что там есть, за исключением, конечно. По сути, каждый ваш экран должен быть фрагментом, чтобы вы могли поместить его вfragmentвот так все этоNavigationсистема работает.

Как я уже упоминал выше в своем вопросе, я собирался поставитьViewPagerв котором я не совсем знал, был ли правильный ход изначально, на самом деле это было то, что мне нужно. Единственное изменение, которое мне нужно сделать, это перенести часть моего кода вActivitys дляFragments, поэтому я могу легко добавить их в файл . Дальше все было довольно просто. Я пытался иметь несколько s, а затем один main, которыйincluded делает маленькие, но, похоже, не работает. Поэтому в конце я просто объединил их. Вот как выглядит мой финал:

      <?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"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_nav_graph"
    app:startDestination="@+id/monitoring_fragment">

    <!--monitoring-->
    <fragment
        android:id="@+id/monitoring_fragment"
        android:name="com.example.app.MonitoringFragment"
        android:label="@string/monitoring"
        tools:layout="@layout/fragment_monitoring">
        <action
            android:id="@+id/showActuatorInfoDetails"
            app:destination="@id/actuatorInfoWithUpdatesFragment" />
        <action
            android:id="@+id/showSensorReadingDetails"
            app:destination="@id/sensorReadingDetailsFragment" />
    </fragment>
    <fragment
        android:id="@+id/actuatorInfoWithUpdatesFragment"
        android:name="com.example.app.ActuatorInfoDetailsFragment"
        android:label="@string/actuator_details"
        tools:layout="@layout/fragment_actuator_info_details">
        <argument
            android:name="actuator_info"
            app:argType="com.example.app.models.api.ActuatorDeviceInfo" />
    </fragment>
    <fragment
        android:id="@+id/sensorReadingDetailsFragment"
        android:name="com.example.app.SensorReadingDetailsFragment"
        android:label="@string/sensor_details"
        tools:layout="@layout/fragment_sensor_reading_details">
        <argument
            android:name="sensor_reading"
            app:argType="com.example.app.models.misc.SensorReading" />
    </fragment>

    <!--user_mgmt-->
    <fragment
        android:id="@+id/login_fragment"
        android:name="com.example.app.fragments.user_mgmt.LoginFragment"
        android:label="@string/login"
        tools:layout="@layout/fragment_login">
        <action
            android:id="@+id/action_loginFragment_to_userManagementFragment"
            app:destination="@id/userManagementFragment" />
    </fragment>
    <fragment
        android:id="@+id/userManagementFragment"
        android:name="com.example.app.fragments.user_mgmt.UserManagementFragment"
        android:label="@string/user_mgmt"
        tools:layout="@layout/fragment_user_management" />
</navigation>

Что странно, что я понял в конце концов, похоже, мне действительно нужно иметь один и тот же идентификатор дляMenuItemчто соответствует модулю и идентификатору запуска «маршрутов» вnav_graph. Android Studio обнаруживает это, и мне приходится принятьDialogэто всплыло с упоминанием этого факта. Вот мой финалmenuдля ящика:

      <?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/monitoring_fragment"
            android:title="@string/drawer_menu_monitoring" />
        <item
            android:id="@+id/login_fragment"
            android:title="@string/drawer_menu_user_mgmt" />
    </group>
</menu>

Вот и все

Другие вопросы по тегам