android 如何在ViewPager中使用NavHostFragment

xyhw6mcr  于 2023-05-21  发布在  Android
关注(0)|答案(1)|浏览(163)

因此,我已经阅读了www.example.com的大部分https://developer.android.com/guide/navigation/navigation-multi-module#groovy,并且相当了解如何实现nav_graph等内容。但是我有一个有点复杂的用例,我没有一个具体的想法如何实现。
在我的应用程序中,我将有一个看起来像这样的结构:

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吗?

xurqigkl

xurqigkl1#

我从导航抽屉视图活动模板中找到了一些想法。我基本上只是复制了里面的东西,当然除了nav_graph。所以基本上,你拥有的每个屏幕都需要在一个片段中,这样你就可以把它放在一个fragment中,因为这就是整个Navigation系统的工作方式。
正如我上面提到的问题,我打算把ViewPager放在Fragment中,我并不完全知道这是正确的举动,最初实际上是我需要的。我唯一要做的更改是将我在Activity s中的一些代码转移到Fragment s中,这样我就可以轻松地将它们添加到nav_graph上。之后就很简单了我试着有多个nav_graph s然后一个主nav_graphinclude d做小的,但似乎不工作。最后我把它们结合在一起。下面是我的最终nav_graph的样子:

<?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的id和在nav_graph中启动“路由”的id相同。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>

就是这样

相关问题