Мне было любопытно, как можно перейти к вложенному навигационному графу из пункта меню в макете ящика, используя навигационный граф из Android Jetpack. Я знаю, что за кулисами есть какая-то магия, которая связывает пункты меню с фрагментами на основе идентификатора, но я не могу понять, как связать пункт меню с вложенным графом навигации.
В качестве примера я использую проект Navigation Drawer Activity по умолчанию, который поставляется с Android Studio. Я изменил файл mobile_navigation.xml следующим образом:
<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/mobile_navigation"
app:startDestination="@+id/nav_home">
<fragment
android:id="@+id/nav_home"
android:name="com.example.testdrawer.ui.home.HomeFragment"
android:label="@string/menu_home"
tools:layout="@layout/fragment_home" />
<include app:graph="@navigation/nested_navigation" />
<fragment
android:id="@+id/nav_tools"
android:name="com.example.testdrawer.ui.tools.ToolsFragment"
android:label="@string/menu_tools"
tools:layout="@layout/fragment_tools" />
<fragment
android:id="@+id/nav_share"
android:name="com.example.testdrawer.ui.share.ShareFragment"
android:label="@string/menu_share"
tools:layout="@layout/fragment_share" />
<fragment
android:id="@+id/nav_send"
android:name="com.example.testdrawer.ui.send.SendFragment"
android:label="@string/menu_send"
tools:layout="@layout/fragment_send" />
</navigation>
Я также добавил новый навигационный граф с именем nested_navigation.xml, который выглядит следующим образом:
<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/nested_navigation"
app:startDestination="@+id/nav_gallery">
<fragment
android:id="@+id/nav_gallery"
android:name="com.example.testdrawer.ui.gallery.GalleryFragment"
android:label="@string/menu_gallery"
tools:layout="@layout/fragment_gallery" />
<fragment
android:id="@+id/nav_slideshow"
android:name="com.example.testdrawer.ui.slideshow.SlideshowFragment"
android:label="@string/menu_slideshow"
tools:layout="@layout/fragment_slideshow" />
</navigation>
И допустим, мое меню выглядит так:
<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/nav_home"
android:icon="@drawable/ic_menu_camera"
android:title="@string/menu_home" />
<item
android:id="@+id/nested_navigation"
android:icon="@drawable/ic_menu_gallery"
android:title="Photos Graph" />
<item
android:id="@+id/nav_tools"
android:icon="@drawable/ic_menu_manage"
android:title="@string/menu_tools" />
</group>
<item android:title="Communicate">
<menu>
<item
android:id="@+id/nav_share"
android:icon="@drawable/ic_menu_share"
android:title="@string/menu_share" />
<item
android:id="@+id/nav_send"
android:icon="@drawable/ic_menu_send"
android:title="@string/menu_send" />
</menu>
</item>
</menu>
По сути, я просто хочу знать, как я могу щелкнуть элемент меню в ящике, чтобы перейти к начальному пункту назначения вложенного навигационного графика.
Изменить: я понял, как это сделать с реализацией интерфейса NavigationView.OnNavigationItemSelectedListener и ручным запуском навигации через глобальное действие:
override fun onNavigationItemSelected(item: MenuItem): Boolean {
when(item.itemId){
R.id.nested_navigation -> {
findNavController(R.id.nav_host_fragment).navigate(R.id.action_nested_navigation)
}
}
drawer_layout.closeDrawer(GravityCompat.START)
return true
}
Я все еще надеюсь, что есть способ сделать это с помощью автоматических соглашений об именах.
Любая помощь будет принята с благодарностью, большое спасибо!
1 ответ
На самом деле, у меня это работает довольно стандартным образом. Ваши файлы XML выглядят нормально, но включили ли вы также R.id.nested_navigation в topLevelDestinationIds в конфигурации AppBar?
val navController = findNavController(R.id.nav_host_fragment)
appBarConfiguration = AppBarConfiguration(
setOf(
R.id.nav_home,
R.id.nav_tools,
R.id.nav_share,
R.id.nav_send.
R.id.nested_navigation
),
drawerLayout
)
setupActionBarWithNavController(navController, appBarConfiguration)
navView.setupWithNavController(navController)
Если это не решит вашу проблему, поделитесь кодом для настройки представления навигации.
Похожие вопросы
Новые вопросы
android
Android — это мобильная операционная система Google, используемая для программирования или разработки цифровых устройств (смартфонов, планшетов, автомобилей, телевизоров, одежды, очков, IoT). Для тем, связанных с Android, используйте теги, специфичные для Android, такие как android-intent, android-activity, android-adapter и т. д. Для вопросов, отличных от разработки или программирования, но связанных с Android framework, используйте эту ссылку: https://android .stackexchange.com.