График навигации с несколькими пунктами назначения верхнего уровня - PullRequest
0 голосов
/ 19 ноября 2018

В свободное время я внедряю приложение для Android (на Kotlin, но это не относится к проблеме), и я пытаюсь использовать android jetpack и новые библиотеки.У меня есть одно действие с навигационным ящиком.Я стараюсь следовать примеру подсолнечника .Он использует следующую комбинацию в основном действии, чтобы включить логику в навигационном блоке:

appBarConfiguration = AppBarConfiguration(navController.graph, drawerLayout)
setSupportActionBar(findViewById(R.id.toolbar))
setupActionBarWithNavController(navController, appBarConfiguration)

Примечание к этому коду : при переходе по щелчку внавигационный ящик и закройте ящик, оставьте их выбранными и т. д. Весь этот стандартный код.Это довольно опрятно и тоже работает.Насколько я понимаю, идентификаторы пунктов меню навигационного ящика должны совпадать с идентификаторами фрагментов на графике навигации и таким образом они соединяются.

У меня проблема : Когда я использую панель навигации для перехода к любому фрагменту, кроме начального фрагмента графика навигации, вместо элемента для гамбургера будет отображаться кнопка «Назад».Это не то, что я ожидаю, я бы ожидал, что это все еще будет гамбургер, поскольку блок навигации предназначен для навигации между представлениями на одинаковом уровне, а не вложенными друг в друга, верно?Я ожидаю кнопку возврата, если перейду к субфрагменту какого-либо фрагмента, щелкнув элементы в этом фрагменте (например, список -> подробности), но не при переходе с использованием панели навигации.

Теперь я проследил эту проблемуВернемся к конструктору AppBarConfiguration, который читает на конструкторе, принимающем navgraph The NavGraph whose start destination should be considered the only top level destination.. Я могу довольно легко это исправить, переопределив AppBarConfiguration, чтобы возвращать другие пункты назначения верхнего уровня, отличные от только начального пункта назначения навигационного графа.

Однако мой вопрос: почему это поведение по умолчанию?Это ошибка?Если я переопределю это, нарушу ли я некоторые рекомендации по дизайну от Google?Разве не все элементы в навигационной панели должны быть на одном уровне, как я ожидал?Есть ли другое решение, которое я хочу сделать?

Ответы [ 3 ]

0 голосов
/ 09 декабря 2018

Я сделал простой пример для этой проблемы.https://github.com/isaul32/android-sunflower

Сначала создайте набор адресатов верхнего уровня

val topLevelDestinations = setOf(R.id.garden_fragment,
        R.id.plant_list_fragment)
appBarConfiguration = AppBarConfiguration.Builder(topLevelDestinations)
        .setDrawerLayout(drawerLayout)
        .build()

, а затем переопределите функцию onSupportNavigateUp, например,

override fun onSupportNavigateUp(): Boolean {
    return NavigationUI.navigateUp(navController, appBarConfiguration)
}
0 голосов
/ 30 июля 2019

Чтобы получить правильное поведение панели инструментов и ящика с несколькими пунктами назначения верхнего уровня, вы можете использовать следующий код:

val navController = Navigation.findNavController(this, R.id.nav_host_fragment)
val toolbar = findViewById<Toolbar>(R.id.toolbar)
val drawerLayout = findViewById<DrawerLayout>(R.id.drawer_layout)

/*
Create AppBarConfiguration with set of top level destinations and drawerLayout
Set contains ids of your navigation graph screens
*/
val appBarConfiguration = AppBarConfiguration(
    setOf(R.id.defaultFragment, R.id.firstFragment, R.id.secondFragment), 
    drawer_layout
)

//finally configure toolbar
toolbar.setupWithNavController(navController, appBarConfiguration)

Этот код гарантирует, что значок гамбургера будет отображаться на всех ваших пунктах назначения высшего уровня, а кнопка возврата появится при более глубокой навигации.

Подробнее здесь

0 голосов
/ 20 ноября 2018

Вам не нужно переопределять AppBarConfiguration. Начиная с версии alpha7 AppBarConfiguration имеет конструктор с набором идентификаторов для всех пунктов назначения верхнего уровня.

Set<Integer> topLevelDestinations = new HashSet<>();
topLevelDestinations.add(R.id.fragment1);
topLevelDestinations.add(R.id.fragment2);
appBarConfiguration = new AppBarConfiguration.Builder(topLevelDestinations)
                                             .setDrawerLayout(drawerLayout)
                                             .build();
NavigationUI.setupActionBarWithNavController(this, 
                                             this.navController,
                                             this.appBarConfiguration);

Это не значение по умолчанию, поскольку в навигационном графике есть только один начальный фрагмент, который всегда должен быть единственной точкой входа в приложение.

Редактирование поведения по умолчанию с помощью AppBarConfiguration не приводит к тому, что оно ведет себя как прежде, каждый фрагмент верхнего уровня помещается в задний стек, поэтому кнопка «Назад» перейдет ко всем фрагментам верхнего уровня. Неясно, как я могу сделать фрагменты верхнего уровня в качестве первого элемента заднего стека.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...