Ящик навигации не закрывается при настройке с помощью Nav-контроллера

#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){...} настройка в домашнем фрагменте.