#android #navigation-drawer
Вопрос:
Я следую за документом навигационного интерфейса. (https://developer.android.com/guide/navigation/navigation-ui#add_a_navigation_drawer) чтобы настроить мой ящик с пользовательским интерфейсом навигации.
Проблема в том, что при нажатии кнопки «Назад» на устройстве ящик все еще открыт, когда он переходит на предыдущую страницу.
Я хочу, чтобы он закрыл ящик и использовал событие, или, если ящик не открыт, вернитесь на предыдущую страницу.
Вот мой navGraph, где домашняя страница содержит макет ящика
HomeFragment
<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@ id/drawerLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- Layout to contain contents of main body of screen (drawer will slide over this) -->
<LinearLayout
...
<androidx.fragment.app.FragmentContainerView
android:id="@ id/nav_host_home"
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_content" />
</LinearLayout>
<!-- Container for contents of drawer - use NavigationView to make configuration easier -->
<com.google.android.material.navigation.NavigationView
android:id="@ id/nav_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="start"
android:fitsSystemWindows="true"
app:headerLayout="@layout/nav_header_main"
app:itemIconTint="@color/colorLightBlue"
app:itemTextColor="@color/colorDarkBlue"
app:menu="@menu/menu_drawer"
android:layout_weight="1">
</androidx.drawerlayout.widget.DrawerLayout>
HomeFragment.kt свяжите представление навигации (binding.NavView) с navGraph nav_content
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// bind the drawer with the navigation graph
val navHostFragment = childFragmentManager.findFragmentById(R.id.nav_host_home) as NavHostFragment
val navController = navHostFragment.navController
binding.drawerLayout.nav_view.setupWithNavController(navController)
binding.navView.setupWithNavController(navController)
навигационный график nav_content, дочерний элемент домашнего фрагмента
Краткие сведения
Я знаю, что есть mDrawerLayout.closeDrawers();
Но если я нахожусь в одном из этих дочерних фрагментов, было бы больно найти родительский фрагмент (домашний фрагмент), найти вид макета и закрыть его. Также, как использовать это обратное событие? Заранее спасибо
Комментарии:
1. Вы можете использовать
OnBackPressedDispatcher
событие, чтобы получить кнопку «Назад», а затем использоватьmDrawerLayout.closeDrawers();
функцию, о которой вы уже упоминали.2. @AndroidKotlinNoob спасибо, я тоже об этом подумал, 1. для этого мне нужно установить OnBackPressedDispatcher для каждого фрагмента внутри навигационного графика nav_content 2. каждый фрагмент сталкивается с проблемой необходимости получения экземпляра NavDrawer из его фрагмента хостинга
3. Если вы сделаете это во Фрагментах, которые находятся внутри navGraph, то да, это потребуется. Но вы также можете сделать это во фрагменте/действии, в котором размещен navGraph.
4. Я тоже попытался установить onBackPressedDispatcher на фрагменте хостинга. Не удалось получить событие в дочернем фрагменте.
requireActivity().onBackPressedDispatcher.addCallback(this){...}
настройка в домашнем фрагменте.