DrawerLayout с компонентом навигации: гамбургер-меню в местах назначения верхнего уровня, не являющихся домашними, не загружает ящик - PullRequest
0 голосов
/ 30 мая 2020
• 1000
class MainActivity : AppCompatActivity(), SubjectFragment.OnListFragmentInteractionListener {
    lateinit var drawerLayout: DrawerLayout

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        drawerLayout = findViewById<DrawerLayout>(R.id.main_drawer_layout)
        val navView = findViewById<NavigationView>(R.id.main_navigation_view)
        val sroToolbar = findViewById<Toolbar>(R.id.main_toolbar)
        val navController = findNavController(R.id.nav_host_fragment)

        navView.setupWithNavController(navController)
        setSupportActionBar(sroToolbar)

        val appBarConfiguration = AppBarConfiguration(
            setOf(R.id.subjectFragment, R.id.aboutFragment, R.id.settingsFragment),
            drawerLayout
        )
        setupActionBarWithNavController(navController, appBarConfiguration)

    }

    override fun onSupportNavigateUp(): Boolean {
        return findNavController(R.id.nav_host_fragment).navigateUp(drawerLayout)
    }

Выше я использую AppBarConfiguration для настройки трех пунктов назначения верхнего уровня (subjectFragment, aboutFragment, settingsFragment), при этом subjectFragment является исходным пунктом назначения в графе навигации. Вот мой график навигации:

<?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/sro_nav_graph"
    app:startDestination="@id/subjectFragment">

    <fragment
        android:id="@+id/subjectFragment"
        android:name="black.old.spacedrepetitionowl.SubjectFragment"
        android:label="Spaced Repetition Owl: Subjects"
        tools:layout="@layout/fragment_subject_list" >
        <action
            android:id="@+id/action_subjectFragment_to_aboutFragment"
            app:destination="@id/aboutFragment" />
        <action
            android:id="@+id/action_subjectFragment_to_settingsFragment"
            app:destination="@id/settingsFragment" />
    </fragment>
    <fragment
        android:id="@+id/aboutFragment"
        android:name="black.old.spacedrepetitionowl.AboutFragment"
        android:label="Spaced Repetition Owl: About"
        tools:layout="@layout/fragment_about" />
    <fragment
        android:id="@+id/settingsFragment"
        android:name="black.old.spacedrepetitionowl.settingsFragment"
        android:label="fragment_settings"
        tools:layout="@layout/fragment_settings" />
</navigation>

Когда я запускаю приложение, он показывает фрагмент объекта, и при нажатии гамбургер-меню открывается ящик. Пока это правильное поведение. Затем в моем ящике отображаются три элемента: «Предметы», «Настройки» и «О программе».

Когда я выбираю «Настройки» / «О программе» в меню, это затем правильно открывает фрагмент «Настройки / О программе».

Моя проблема в том, что когда я нахожусь на этих двух экранах, нажатие значка гамбургера затем загружает SubjectFragment вместо того, чтобы отображать ящик. Вот GIF-изображение того, что произошло:

hamburger icon not showing the drawer content

Я хочу, чтобы ящик загружался каждый раз, когда гамбургер-меню нажимается в каждом из этих пунктов назначения. . В чем может быть проблема?

1 Ответ

0 голосов
/ 30 мая 2020

Ага! Я понял это, сравнив его с новым проектом, созданным с использованием «Действия с навигационным ящиком» в качестве шаблона проекта.

Как оказалось, appBarConfiguration необходимо использовать как параметр для navigateUp, поэтому что соблюдаются настройки мест назначения верхнего уровня:

    override fun onSupportNavigateUp(): Boolean {
        val navController = findNavController(R.id.nav_host_fragment)
        return navController.navigateUp(appBarConfiguration) || super.onSupportNavigateUp()
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...