Как использовать 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
в котором я не совсем знал, был ли правильный ход изначально, на самом деле это было то, что мне нужно. Единственное изменение, которое мне нужно сделать, это перенести часть моего кода вActivity
s дляFragment
s, поэтому я могу легко добавить их в файл . Дальше все было довольно просто. Я пытался иметь несколько s, а затем один main, которыйinclude
d делает маленькие, но, похоже, не работает. Поэтому в конце я просто объединил их. Вот как выглядит мой финал:
<?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>
Вот и все